Python wx.同一类中的框架和线程

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

我正在尝试创建一个同时处理wx.Frame和线程的类(我尝试使用户可视化(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相关的类。这是正常的,也是推荐的做法。有关详细信息,请参阅以下链接:


wxPython要求其主循环位于主线程中,这与其他桌面GUI工具包(如PyQt、Tkinter等)非常相似。您应该仅在wxPython的主循环启动后启动线程。换句话说,线程应该从wxPython内启动

wxPython有三种线程安全方法。它们如下:

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


bah我大部分时间都是打印出来的(你必须对wx;P有某种提醒)…可能值得一提的是wx.CallAfter(尽管我相信所有这些链接都有),作为@bruno-Mikes博客的旁白(见第二个链接)对于wx来说,这是一个惊人的资源!我很幸运…但我相信你的答案也会很好!呸,我大部分时间都是打出来的(你必须对wx;P有某种提醒)…可能值得一提的是wx.CallAfter(尽管我相信所有这些链接都有)作为@bruno Mikes博客的旁白(见第二个链接)wx是一个神奇的资源!我很幸运…但我相信你的答案也会很好!我同意MikeDriscoll的答案,但我想建议,一旦你调用Destroy()在WX对象上,你根本不应该使用它。每个WX对象都是由C++代理对象支持的,它在调用破坏后可能已经死了或者处于不可用状态。在你的关闭方法中,代码在你销毁它之后使用Self.App。有时候你可能会侥幸逃脱,但这不是个好主意。我同意MikeDriscoll的回答。但我想建议,一旦你调用Destroy()在WX对象上,你根本不应该使用它。每个WX对象都是由C++代理对象支持的,它在调用破坏之后可能已经死了或者处于不可用状态。在你的关闭方法中,代码在你销毁它之后使用Self.App。有时候你可能会侥幸逃脱,但这不是个好主意。