关于wxpython界面的有关问题,求解
关于wxpython界面的问题,求解
刚学Python,用wxPython做界面时,发现通过事件来改变控件中的文本时,不会每次改变都显示出来,只会显示最后一次结果。请问有什么方法可以解决吗?
以下是我写的一个简单的界面程序来说明我的问题,点击按键后,文本中直接显示999,我想能看到文本中内容的变化。
[code=Python][/code]
import wx
class MyFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,parent,size=(200,170))
panel = wx.Panel(self)
self.text = wx.TextCtrl(panel,pos = (45,20))
button = wx.Button(panel,pos = (55,60),label='Start')
self.Bind(wx.EVT_BUTTON, self.WirteText, button)
def WirteText(self,event):
for i in range(1000):
self.text.SetValue(unicode(i))
myapp = wx.App(redirect=False)
frame = MyFrame(None)
frame.Show()
myapp.MainLoop()
------解决方案--------------------
按lz 的需求,还是用定时器吧
------解决方案--------------------
你的for循环在wx的主线程里,运行到for的时候程序阻塞在那,导致wx的界面不会重新渲染,所以for循环之后才会显示当然是最后一个了,用定时器的话,其实是多了个线程,你的wx主循环正常运行,不会阻塞,
------解决方案--------------------
刚学Python,用wxPython做界面时,发现通过事件来改变控件中的文本时,不会每次改变都显示出来,只会显示最后一次结果。请问有什么方法可以解决吗?
以下是我写的一个简单的界面程序来说明我的问题,点击按键后,文本中直接显示999,我想能看到文本中内容的变化。
[code=Python][/code]
import wx
class MyFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,parent,size=(200,170))
panel = wx.Panel(self)
self.text = wx.TextCtrl(panel,pos = (45,20))
button = wx.Button(panel,pos = (55,60),label='Start')
self.Bind(wx.EVT_BUTTON, self.WirteText, button)
def WirteText(self,event):
for i in range(1000):
self.text.SetValue(unicode(i))
myapp = wx.App(redirect=False)
frame = MyFrame(None)
frame.Show()
myapp.MainLoop()
------解决方案--------------------
按lz 的需求,还是用定时器吧
------解决方案--------------------
你的for循环在wx的主线程里,运行到for的时候程序阻塞在那,导致wx的界面不会重新渲染,所以for循环之后才会显示当然是最后一个了,用定时器的话,其实是多了个线程,你的wx主循环正常运行,不会阻塞,
------解决方案--------------------
- Python code
import wx import time class MyFrame(wx.Frame): def __init__(self,parent): wx.Frame.__init__(self,parent,size=(200,170)) panel = wx.Panel(self) self.text = wx.TextCtrl(panel,pos = (45,20)) button = wx.Button(panel,pos = (55,60),label='Start') self.Bind(wx.EVT_BUTTON, self.WirteText, button) def WirteText(self,event): for i in range(1000): self.text.SetValue(unicode(i)) self.text.SetFocus() time.sleep(1) myapp = wx.App(redirect=False) frame = MyFrame(None) frame.Show() myapp.MainLoop()