Python多线程-无法同时运行

时间:2018-12-12 07:20:18

标签: python multithreading tkinter

我试图学习python

。但是我在线程方面有问题。首先,我在“ 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不起作用。*

我应如何执行此类任务? 感谢您的帮助,建议和解答

1 个答案:

答案 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窗口。

我希望它将对您有帮助