免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4299 | 回复: 3
打印 上一主题 下一主题

请教一个wxpython的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-17 15:59 |只看该作者 |倒序浏览
请看下面这段代码,我希望实现当按下“计算”按钮的时候,对data1和data2的数据进行计算,比如相加,然后把结果输出在同一个界面里,应该怎么实现?
我想的是,当按下“计算”后,在位置(10, 140)生成一个wx.StaticText, 然后把结果显示出来,但是还没成功,谁能指导一下?

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. import wx
  4. class RefactorExample(wx.Frame):
  5.     def __init__(self, parent, id):
  6.         wx.Frame.__init__(self, parent, id, 'Refactor Example',
  7.             size=(340, 200))
  8.         panel = wx.Panel(self, -1)
  9.         panel.SetBackgroundColour("White")
  10.         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
  11.         self.createButtonBar(panel)
  12.         self.createTextFields(panel)
  13.     def buttonData(self): #按钮栏数据
  14.         return (("计算", self.OnFirst), ("关闭", self.OnLast))
  15.     #创建按钮
  16.     def createButtonBar(self, panel, yPos = 70):
  17.         xPos = 50
  18.         for eachLabel, eachHandler in self.buttonData():
  19.             pos = (xPos, yPos)
  20.             button = self.buildOneButton(panel, eachLabel,
  21.             eachHandler, pos)
  22.             xPos += button.GetSize().width
  23.     def buildOneButton(self, parent, label, handler, pos=(0,0)):
  24.         button = wx.Button(parent, -1, label, pos)
  25.         self.Bind(wx.EVT_BUTTON, handler, button)
  26.         return button
  27.     def textFieldData(self): #文本数据
  28.         return (("Data1:", (10, 10)),
  29.             ("Data2:", (10, 40)))
  30.     #创建文本
  31.     def createTextFields(self, panel):
  32.         for eachLabel, eachPos in self.textFieldData():
  33.             self.createCaptionedText(panel, eachLabel, eachPos)
  34.     def createCaptionedText(self, panel, label, pos):
  35.         static = wx.StaticText(panel, wx.NewId(), label, pos)
  36.         static.SetBackgroundColour("White")
  37.         textPos = (pos[0] + 75, pos[1])
  38.         wx.TextCtrl(panel, wx.NewId(), "", size=(140, -1), pos=textPos)
  39.     # 空的事件处理器放在一起
  40.     def OnLast(self, event):
  41.         self.Close(True)
  42.     def OnFirst(self, event): pass
  43.     def OnCloseWindow(self, event):
  44.         self.Destroy()
  45. if __name__ == '__main__':
  46.     app = wx.PySimpleApp()
  47.     frame = RefactorExample(parent=None, id=-1)
  48.     frame.Show()
  49.     app.MainLoop()
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-06-17 16:29 |只看该作者
想到一个办法,我可以在初始化的时候,初始化一个TextCtrl,然后在执行OnFirst方法的时候,改变这个TextCtrl的value就可以了。

现在的问题是,Data1和Data2都是在createCaptionedText时候通过循环生成的,我通过什么方法能取到Data1和Data2的值? TextCtrl.GetValue()?这样取出来的是哪个文本框的值啊?

论坛徽章:
0
3 [报告]
发表于 2010-08-19 15:17 |只看该作者
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import wx
class RefactorExample(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, 'Refactor Example',
            size=(340, 200))
        panel = wx.Panel(self, -1)
        panel.SetBackgroundColour("White")
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
        self.createButtonBar(panel)
        self.createTextFields(panel)
    def buttonData(self): #按钮栏数据
        return (("计算", self.OnFirst), ("关闭", self.OnLast))
    #创建按钮
    def createButtonBar(self, panel, yPos = 70):
        xPos = 50
        for eachLabel, eachHandler in self.buttonData():
            pos = (xPos, yPos)
            button = self.buildOneButton(panel, eachLabel,
            eachHandler, pos)
            xPos += button.GetSize().width
    def buildOneButton(self, parent, label, handler, pos=(0,0)):
        button = wx.Button(parent, -1, label, pos)
        self.Bind(wx.EVT_BUTTON, handler, button)
        return button
    def textFieldData(self): #文本数据
        return (("Data1:", (10, 10)),
            ("Data2:", (10, 40)))
    #创建文本
    def createTextFields(self, panel):
        for eachLabel, eachPos in self.textFieldData():
            self.createCaptionedText(panel, eachLabel, eachPos)
    def createCaptionedText(self, panel, label, pos):
        static = wx.StaticText(panel, wx.NewId(), label, pos)
        static.SetBackgroundColour("White")
        textPos = (pos[0] + 75, pos[1])
        wx.TextCtrl(panel, wx.NewId(), "", size=(140, -1), pos=textPos)
    # 空的事件处理器放在一起
    def OnLast(self, event):
        self.Close(True)
    def OnFirst(self, event): pass
    def OnCloseWindow(self, event):
        self.Destroy()
if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = RefactorExample(parent=None, id=-1)
    frame.Show()
    app.MainLoop()

论坛徽章:
0
4 [报告]
发表于 2010-08-20 16:51 |只看该作者
本帖最后由 ncoder 于 2010-08-20 16:54 编辑

这个我觉得就是对你循环出来的控件进行取值,求值,并显示吧
如果是这样的话, 我觉得觉得可以这样, 不知道对不对:

1. 初始化时, 添加一个用于显示结果的变量, 还有一个用于保存循环创建出来的控件的变量
  1. def __init__(self, parent, id):
  2.     wx.Frame.__init__(self, parent, id, 'Refactor Example',size=(340, 200))

  3.      self.result = None
  4.      self.txtCtrls = []

  5.      self.panel = wx.Panel(self, -1)
  6.      self.panel.SetBackgroundColour("White")
  7.      self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
  8.      self.createButtonBar(self.panel)
  9.      self.createTextFields(self.panel)
复制代码
2. 在创建控件的时候保存控件
  1. def createTextFields(self, panel):
  2.      for eachLabel, eachPos in self.textFieldData():
  3.           self.txtCtrls.append(self.createCaptionedText(panel, eachLabel, eachPos))
复制代码
3. 取值, 求值, 显示
  1. def OnFirst(self, event):
  2.      if self.result is None:
  3.           self.result = wx.StaticText(self.panel, wx.NewId(), '', (10, 140))
  4.      sum = 0
  5.      for item in self.txtCtrls:
  6.           try:
  7.                val = int(item.GetValue())
  8.                sum += val
  9.           except:
  10.                continue
  11.      self.result.SetLabel(str(sum))
复制代码
水平很菜, 不知道能不能帮到忙{:2_169:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP