在 Kivy/Python 中作为线程运行时表现奇怪的函数
Posted
技术标签:
【中文标题】在 Kivy/Python 中作为线程运行时表现奇怪的函数【英文标题】:Functions acting strange when run as thread in Kivy/Python 【发布时间】: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 秒后发生,以创建一个显示“正在运行”的弹出窗口,然后在我的函数结束时关闭该弹出窗口。如果这是一个有效的想法,我该怎么做? 图形修改操作必须在主线程中运行。您可以在那里打开弹出窗口,然后将长时间运行的操作放在另一个线程中,这应该可以正常工作。 文档中有一个例子:kivy.org/docs/api-kivy.uix.popup.html @inclement,这是我试图做的,但我的长时间运行的操作应该在完成后更新图形(漫长的过程是在滚动视图中构建按钮的网格布局) .我应该在我的线程中构建所有这些进程,然后当线程完成时在主线程中使用某种事件来触发将新的滚动视图添加到主视图? 【参考方案1】:免责声明:我没有与 Kivy 合作过。
并非每个框架都适用于多线程。
但大多数 GUI 框架都有一个 event loop,它负责管理用户事件(鼠标点击、键盘)和排队的绘图操作(小部件)。
在您的情况下,如果不希望 UI 被冻结,您应该定期将控制权交给框架的事件循环。
我猜kivy.base.EventLoopBase.dispatch_input
是您需要调用的,以显示添加的小部件或处理用户事件。
【讨论】:
以上是关于在 Kivy/Python 中作为线程运行时表现奇怪的函数的主要内容,如果未能解决你的问题,请参考以下文章
将当前单击的按钮作为参数传递给 Kivy (Python) 中的 on_press
如何在kivy python中使用滑块作为进度条并控制音频?