Python wx.同一类中的框架和线程
我正在尝试创建一个同时处理wx.Frame和线程的类(我尝试使用户可视化(threadins.Thread,wx.Frame)也是,但我没有成功。我真的不想使用wx.CallAfter,我只想在一个类中处理它。当我运行代码时,一切正常,但Close方法会使程序崩溃,框架保持打开。我错在哪里Python wx.同一类中的框架和线程,python,multithreading,wxpython,Python,Multithreading,Wxpython,我正在尝试创建一个同时处理wx.Frame和线程的类(我尝试使用户可视化(threadins.Thread,wx.Frame)也是,但我没有成功。我真的不想使用wx.CallAfter,我只想在一个类中处理它。当我运行代码时,一切正常,但Close方法会使程序崩溃,框架保持打开。我错在哪里 import threading import wx class Visual(threading.Thread): def __init__(self, title): s
import threading
import wx
class Visual(threading.Thread):
def __init__(self, title):
screenWidth = 500
screenHeight = 400
screenSize = (screenWidth,screenHeight)
self.app = wx.App(False)
self.frame = wx.Frame(None, wx.ID_ANY,title, size=screenSize)
panel = wx.Panel(self.frame)
self.list_ctrl = wx.ListCtrl(panel, size=(-1,100),
style=wx.LC_REPORT
|wx.BORDER_SUNKEN
)
self.list_ctrl.InsertColumn(0, 'Name', width=125)
self.list_ctrl.InsertColumn(1, 'DDD')
self.list_ctrl.InsertColumn(2, 'Phone')
self.list_ctrl.InsertColumn(3, 'Desc', width=125)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.list_ctrl, 0, wx.ALL|wx.EXPAND, 5)
panel.SetSizer(sizer)
self.ready = False
threading.Thread.__init__(self)
self.frame.Bind(wx.EVT_CLOSE, self.close)
self.start()
def close(self, event):
print("Close")
self.frame.Destroy()
self.app.Destroy()
self.app.ExitMainLoop()
def run(self):
self.frame.Show(True)
self.ready = True
self.app.MainLoop()
if __name__ == '__main__':
visu = Visual(title='Test')
谢谢。wxPython要求其主循环位于主线程中,这与其他桌面GUI工具包(如PyQt、Tkinter等)非常相似。您应该仅在wxPython的主循环启动后启动线程。换句话说,线程应该从wxPython内启动 wxPython有三种线程安全方法。它们如下:
- wx.CallAfter
- wx.PostEvent
- wx.CallLater
- wx.CallAfter
- wx.PostEvent
- wx.CallLater