繁体   English   中英

Python tkinter - 即使使用多线程,GUI 也“滞后”

[英]Python tkinter - GUI is 'lagging' even with Multithreading

我正在编写一个 tkinter 项目,其中我有一个与仪器的串行连接。 一旦建立连接(通过单击 GUI 上的按钮完成),我将运行一个循环,在其中我向仪器询问各种问题并将答案写入日志 (.txt)。

我以下列方式调用循环:

def Polling():
   global after_polling
   Loop()
   after_polling = app.after(10, func = Polling)

在循环期间,我需要等待 X 毫秒,所以我执行以下操作:

t = threading.Thread(target=sleepms(val))
t.start()
t.join()

我需要等到 X 时间过去,因此t.join()

sleepms function 是:

def sleepms(time_ms):
   time_s=time_ms/1000
   time.sleep(time_s) 

所以我不确定为什么 GUI 变得非常无响应(或者需要很长时间才能响应)。

任何人都知道我做错了什么,我该如何解决这个问题? 谢谢。

使用线程不像你做的那样:

t = threading.Thread(target=sleepms(val))
t.start()
t.join()

那是因为您已经生成了一个线程,但同时主程序被阻塞等待t.join :该程序仍然以顺序方式工作,而不是并行工作。

你通常用线程做的事情是这样的:

t = threading.Thread(target=sleepms(val))
t.start()
# do something here
t.join()

在您的情况下,一种选择是不加入胎面,使其保持活力并将信息传递给它以完成工作。 https://www.geeksforgeeks.org/how-to-use-thread-in-tkinter-python/的简单示例

做这样的事情:

  1. 在单独的 function 中编写核心代码(IE 连接到仪器,等待,写入日志...,您需要的一切)。 您可以在没有 GUI 的情况下测试软件,只需使用 shell。
  2. 添加 GUI 并在 tkinter 的按键事件中使用您的核心代码生成另一个线程。
  3. 注意不要在每次按键时产生一个线程,例如使用一个标志来检查线程是否已经启动。
  4. 如果在线程执行了它应该执行的操作之后,您需要在 GUI 中显示某些内容,您可以使用一些共享数据结构。 请注意,因为使用线程可能会出现并发问题(主线程和辅助线程都可以修改相同的共享变量),但通常如果辅助线程写入共享变量而主线程只读取,您应该可以做到以一种简单的方式。 这只是为了使其简单,因为在线程之间共享数据有更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM