为了账号安全,请及时绑定邮箱和手机立即绑定

如何管理 Python Tkinter 应用程序多线程

如何管理 Python Tkinter 应用程序多线程

偶然的你 2021-08-11 17:13:04
我正在用 Python 开发一个 Tkinter 应用程序。我有两个后台操作和一个用户需求操作。这是我的示例代码:from threading import Threadimport tkinter as tkimport timeclass Controller(object):    def __init__(self, master):        self.master = master        self.btn1 = tk.Button(self.master, text="Start Recording", width=16, height=5, command=lambda: self.start_background_opt())        self.btn1.grid(row=2, column=0)        self.btn3 = tk.Button(self.master, text="Fly", width=16, height=5, command=lambda: self.fly_button())        self.btn3.grid(row=3, column=0)        self.entry = tk.Entry(self.master)        self.entry.grid(row=4, column=0)        self.connect_button_clicked = False        self.thread1 = None        self.thread2 = None        self.thread3 = None        self.flight_completed = False    def background_opt1(self):        while True:            if self.connect_button_clicked:                print("Battery Fetching")            else:                return    def background_opt2(self):        while True:            if self.connect_button_clicked:                print("Signal Fetching")            else:                return    def start_background_opt(self):        if not self.connect_button_clicked:            self.connect_button_clicked = True            self.thread1 = Thread(target=self.background_opt1).start()            self.thread2 = Thread(target=self.background_opt2).start()        else:            self.connect_button_clicked = False            self.thread1 = None            self.thread2 = None    def flight_operation_controller(self):        if self.flight_completed:            self.thread3 = None    def fly_button(self):        self.flight_completed = False        self.thread3 = Thread(target=self.static_sim()).start()因此,当用户单击“开始录制”时,它会启动 2 个后台操作。他们应该作为后台运行。然后当用户单击“飞行”按钮时,应执行飞行操作。为了不阻塞我的主 UI,我将它们放在单独的线程中。实际上我的所有操作都正常工作。我已投入time.sleep 复制我的飞行操作;但是当它运行时,它会阻塞我的整个,即使它在单独的线程中运行。你能告诉我为什么我看到这个吗?我对 Pyhton tkinter 中的多线程的解释是否正确?最好的祝福
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

看看这行代码:

self.thread3 = Thread(target=self.static_sim()).start()

上面的代码和这段代码的工作方式完全一样;

result = self.static_sim()
self.thread3 = Thread(target=result).start()

看到问题了吗?您正在线程外调用您的函数。因为static_sim()有一个无限循环,它永远不会返回。

当您为 设置目标时Thread,它必须是可调用的。把代码改成这样(注意没有尾随()):

self.thread3 = Thread(target=self.static_sim).start()


查看完整回答
反对 回复 2021-08-11
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信