gpt4 book ai didi

python - wx.Frame 和 threading 在同一个类中

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:45 25 4
gpt4 key购买 nike

我正在尝试创建一个同时处理 wx.Frame 和 Threading 的类(我也尝试使用 Visual(threadins.Thread, wx.Frame),但我没有成功。我真的不会想使用 wx.CallAfter 并且我只想在一个类中处理它。当我运行代码时,一切正常,但是 Close 方法使程序崩溃并且框架保持打开状态。我哪里错了?

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

无论如何,这几乎肯定需要你有一个线程类和一个或多个wxPython 相关类。这是正常的,也是推荐的做法。有关详细信息,请参阅以下链接:

关于python - wx.Frame 和 threading 在同一个类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44730218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com