【发布时间】:2015-08-19 02:37:48
【问题描述】:
我正在构建一个应用程序,当用户点击“运行”按钮时,它会生成一个按钮表。
因为这个过程需要一段时间,所以我想添加一个弹出窗口或进度条来提醒用户该函数正在运行并且没有冻结。为此,我决定创建一个弹出窗口并使用线程调用我的函数,以便在函数启动时更新屏幕(而不是一旦完成)。
mythread = threading.Thread(target=run_function)
mythread.start()
问题在于,当我从上面的代码中调用我的函数时,它的工作方式非常奇怪:我的表格列的宽度错误,我的一些按钮是任意空的,还有一些填充颜色错误。要解决这个问题,我需要做的就是删除线程操作并简单地调用 run_function()
知道为什么会这样吗?
我是 Python 新手,所以可能是一些愚蠢的错误,但我不知道。作为线程运行的进程与其默认操作有什么不同?
【问题讨论】:
-
Kivy 可能不是线程安全的。参见例如github.com/kivy/kivy/issues/2548
-
谢谢你提醒我这一点@boardrider。我是使用 Kivy/Python 开发的新手,你能建议一种简单的方法来在没有线程的情况下启动一个 poup 吗?也许我可以安排一个事件在 0.1 秒后发生,以创建一个显示“正在运行”的弹出窗口,然后在我的函数结束时关闭该弹出窗口。如果这是一个有效的想法,我该怎么做?
-
图形修改操作必须在主线程中运行。您可以在那里打开弹出窗口,然后将长时间运行的操作放在另一个线程中,这应该可以正常工作。
-
@inclement,这是我试图做的,但我的长时间运行的操作应该在完成后更新图形(漫长的过程是在滚动视图中构建按钮的网格布局) .我应该在我的线程中构建所有这些进程,然后当线程完成时在主线程中使用某种事件来触发将新的滚动视图添加到主视图?
标签: python python-2.7 user-interface kivy python-multithreading