。但是我在线程方面有问题。首先,我在“ Proces”类中失败了,因为我将循环放到了错误的位置,而我的程序较新的从另一个类返回。
但是现在我认为一切正确,但仍然无法正常工作。 我需要有一个GUI,我希望能够通过文本输入来编写我的条件,并且我需要另一个类“ Proces”来完成工作,不断检查互联网状态等等,等等。
。问题是我的tkinter GUI在按下某些东西后冻结了
这是我的GUI.py文件:
import tkinter as tk
from Proces import Proces
root = tk.Tk()
frame = tk.Frame(root)
frame.pack()
button = tk.Button(frame, text="QUIT", fg="red",command=quit).pack(side=tk.LEFT)
pr = Proces()
print("\nGUI: proces init...")
pr.start()
print("\nGUI: Start ended")
root.mainloop()
这是Proces.py文件:
import time, threading
class Proces(threading.Thread):
def loop(self):
while True:
time.sleep(2)
print("\nProces: looping")
def __init__(self):
threading.Thread.__init__(self)
print("\nProces: Starting proces")
time.sleep(2)
def run(self):
self.deamon = True
print("\nProces: Starting loop")
self.loop()
*这是输出:*
Proces: Starting proces
GUI: proces init...
Proces: Starting loop
GUI: Start ended
Proces: looping
Proces: looping
Proces: looping
Proces: looping
*但是 tkinter 的GUI不起作用。*
我应如何执行此类任务? 感谢您的帮助,建议和解答
答案 0 :(得分:0)
我认为您在启动线程等方面没有问题。但是,您应该能够控制自己的线程,这意味着您的线程应该根据某些条件返回。看来您有一个退出按钮。我假设您想通过单击按钮来完成该过程。
为此,当您单击按钮时,您的主线程应将一个变量传递给Process,以中断<Style TargetType="Button">
<Setter Property="Height" Value="32"/>
<Setter Property="MinWidth" Value="96"/>
<Setter Property="Margin" Value="10"/>
</Style>
循环,而该循环基本上就是您的线程。
这是您可以使用的代码。
while
所以您开始tkinter,这是您的主线程。然后在您的主线程中初始化另一个类,该类继承了该线程。因此,您有两个单独的线程可以正常工作。单击“退出”按钮时,您传递了变量import tkinter as tk
import time
import threading
class MainWindow:
def __init__(self, master):
self.master = master
self.quit_button = tk.Button(self.master, text="QUIT", command=lambda:self.quit(), width=20)
self.quit_button.pack(side=tk.LEFT)
self.process = None
print("\nGUI: process init...")
self.start_task()
def quit(self):
self.process.stop_process = True
print("\nGUI: Start ended")
def start_task(self):
self.process = Process()
self.process.start()
class Process(threading.Thread):
def loop(self):
while True:
if not self.stop_process:
time.sleep(2)
print("\nProcess: looping")
else:
print("\nProcess: looping ended")
return
def __init__(self):
threading.Thread.__init__(self)
self.stop_process = False
print("\nProcess: Starting proces")
time.sleep(2)
def run(self):
self.deamon = True
print("\nProcess: Starting loop")
self.loop()
if __name__ == '__main__':
root = tk.Tk()
app = MainWindow(master=root)
root.mainloop()
,该变量中断循环并返回,这意味着结束线程。您的主线程仍然可以运行tkinter窗口。
我希望它将对您有帮助