【发布时间】:2015-11-02 16:53:33
【问题描述】:
我正在另一个线程中运行一个函数,该函数应该填写一个对话框然后显示它,但只要我试图以任何方式更改对话框,它就会出现段错误。我读到这是 WxPython 的一个常见问题,并且开发人员不打算直接更改另一个线程中的对话框。
我该如何解决这个问题?我可以在我的主线程中调用该函数,但这会阻塞我的 GUI,并且初始化对话框是一个冗长的操作 - 我想避免这种情况。
我的代码与下面类似。
在主线程中
# Create the dialog and initialize it
thread.start_new_thread(self.init_dialog, (arg, arg, arg...))
我正在调用的函数
def init_dialog(self, arg, arg, arg....):
dialog = MyFrame(self, "Dialog")
# Setup the dialog
# ....
dialog.Show()
即使有一个空白对话框并且只是一个简单的调用来显示函数内部,我也会遇到分段错误。任何帮助将不胜感激,谢谢。
【问题讨论】:
-
在工作线程上尝试使用 GUI 组件并不是一个好主意。当以这种方式使用 GUI 组件时,我认为包括 wxPython 在内的大多数 GUI 框架都无法正常工作。确实这里有一篇关于在工作线程中使用 wxPython 的文章wiki.wxpython.org/Non-Blocking%20Gui
-
使用容器类(class foo : pass),添加、删除、更新、调用函数合并你的应用。
-
为什么不在单独的线程中运行“长度操作”,而是在主线程中运行对话框?
-
@tom10 因为主线程将不得不等待操作完成,这是我不想要的。该操作生成一个图形,该图形必须显示在对话框中
-
通常的处理方法是在主线程中点击一个按钮,在不同的线程中进行计算(这样主线程和 GUI 仍然响应),显示一个指示器(如主线程中的“throbber”)表示正在执行计算,然后在计算完成时在主线程中弹出对话框。也就是说,如果您必须等待,那么您就等待,但您不想阻塞主线程或让用户对正在发生的事情一无所知。
标签: python multithreading dialog wxpython wxwidgets