【问题标题】:Tkinter GUI stuck till end of the task when pressing a button按下按钮时,Tkinter GUI 卡住直到任务结束
【发布时间】:2023-03-20 12:01:01
【问题描述】:

当我按下“启动程序”按钮时,它会启动一个 5 秒的任务并阻止 GUI。 据我了解,我需要使用线程,因此每个按钮都将独立于 GUI 工作。 我已经卡了快一个月了,有人可以告诉我如何执行def start_Button(self):使用线程的函数吗?

from tkinter import *
import time


class Window(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def init_window(self):
        self.var = IntVar()
        self.master.title("GUI")
        self.pack(fill=BOTH, expand=1)
        quitButton = Button(self, text="Exit", command=self.client_exit)
        startButton = Button(self, text="Start Program", command=self.start_Button)

        quitButton.grid(row=0,column=0)
        startButton.grid(row=0, column=2)

    def client_exit(self):
        exit()

    def start_Button(self):
        print('Program is starting')
        for i in range (5):
            print(i)
            time.sleep(1)


root = Tk()
root.geometry("200x50")
app = Window(root)
root.title("My Program")
root.mainloop()

【问题讨论】:

    标签: python tkinter python-multithreading


    【解决方案1】:

    在您第一次进入线程之前,有很多重要的问题要问,但总的来说,最重要的问题是“我想如何在线程之间进行通信?”在您的最小示例中,您根本不需要任何通信,但是在您的真实代码中start_Button 可能正在做一些工作并将数据返回给 GUI。如果是这样的话,你还有更多的工作要做。如果是这种情况,请在评论中澄清这一点。

    举个最简单的例子,其实很简单。

    class Window(tkinter.Frame):
        # the rest of your GUI class as written, but change...
    
        def start_Button(self):
            def f():
                # this is the actual function to run
                print('Program is starting')
                for i in range (5):
                    print(i)
                    time.sleep(1)
            t = threading.Thread(target=f)
            t.start()
    

    【讨论】:

    • 我已经尝试了很长时间这样的解决方案,但是无法将线程模块放置在正确的位置,现在您向我展示了它是有道理的!我知道使用线程很棘手,并且可能会干扰,我的程序中不是这种情况(现在..)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2011-01-31
    相关资源
    最近更新 更多