我是Python和OOP的新手,通常做C& VHDL。我必须在“窗口”中定期显示一个值,但似乎无法实现。原样,该值仅获取一次,Quit不起作用。我尝试根据我读过的很多帖子修改它,但我无法让它工作。任何帮助将不胜感激。
这是我在论坛上的第二篇文章。如果我的帖子不符合要求,请通知我。 使用Python 2.7,wxPython 2.8,Windows 7
import wx
import threading
class RspBox(wx.Frame):
def __init__(self, parent, title):
super(RspBox, self).__init__(parent, title=title, size=(500, 500))
self.InitUI()
self.Centre()
self.Show()
def InitUI(self):
sizer = wx.GridBagSizer(7, 7)#(y,x)
self.Ybtn = wx.Button(self, label='Yellow')
self.Gbtn = wx.Button(self, label='Green')
self.Wbtn = wx.Button(self, label='White')
self.Rbtn = wx.Button(self, label='Red')
self.Bbtn = wx.Button(self, label='Blue')
self.ApplyBtn = wx.Button(self, id=wx.ID_APPLY, label='')
self.QuitBtn = wx.Button(self, id=wx.ID_ANY, label='Quit')
self.Label1 = wx.StaticText(self, label='Direction')
self.Label2 = wx.StaticText(self, label='Value')
self.Dir = wx.TextCtrl(self, style=wx.TE_LEFT, value='000000')
self.Val = wx.TextCtrl(self, style=wx.TE_READONLY, value='CAFE')
self.t = self.SetDirection()
sizer.Add(self.Ybtn, pos=(1, 2), span=(1, 1))
sizer.Add(self.Gbtn, pos=(2, 1), span=(1, 1))
sizer.Add(self.Wbtn, pos=(2, 2), span=(1, 1))
sizer.Add(self.Rbtn, pos=(2, 3), span=(1, 1))
sizer.Add(self.Bbtn, pos=(3, 2), span=(1, 1))
sizer.Add(self.Label1, pos=(4, 1), span=(1, 1))
sizer.Add(self.Dir, pos=(4, 2), span=(1, 2))
sizer.Add(self.Label2, pos=(5, 1), span=(1, 1))
sizer.Add(self.Val, pos=(5, 2), span=(1, 2))
sizer.Add(self.ApplyBtn, pos=(6, 2), span=(1, 1))
sizer.Add(self.QuitBtn, pos=(6, 3), span=(1, 1))
self.Bind(wx.EVT_BUTTON, self.stop(self), self.QuitBtn)
self.SetSizer(sizer)
self.Fit()
self.Show()
def SetDirection(self):
"""Set the TextCtrl Direction field periodically"""
Val = 3 #debug
self.Val.SetValue(str(Val))
t = threading.Timer(1, self.SetDirection)
t.start()
print "SetDirection = %s" % Val #debug
return t
def stop(self, event):
self.t.cancel()
if __name__ == '__main__':
print test
app = wx.App()
RspBox(None, title='ResponseBox')
app.MainLoop()
答案 0 :(得分:0)
如果使用线程,则需要使用线程安全方法来更新UI,例如wx.CallAfter或wx.PostEvent。但是,由于您只是根据时间更新值而不是使用长时间运行的进程,我认为您可以使用wx.Timer而不是线程。以下是关于该主题的几个链接: