我正在用 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()
添加回答
举报
0/150
提交
取消