开发者社区 问答 正文

如何在TkInter中实现“处理请求”消息

我正在尝试实现一个弹出窗口,该窗口应在后台进行操作时显示在主窗口上。从下面的代码中按下按钮会导致GUI冻结10秒钟而不显示任何消息,并最终使按钮变为绿色。冻结是正常的,但是我希望在10秒钟内显示弹出窗口。任何帮助,将不胜感激!提前致谢!

import tkinter as tk
import time

class GUI(tk.Tk):
    def __init__(self):
        super().__init__()

        self.button1 = tk.Button(text="Start", command=self.make_green)
        self.button1.pack()


    def popup(self):
        tl = tk.Toplevel(self)
        tl.transient()
        tk.Label(tl, text="Painting green").pack()
        tl.grab_set()
        return tl

    def make_green(self):
        wait_popup = self.popup()
        time.sleep(10)
        self.button1.config(bg="green")
        wait_popup.destroy()

a = GUI()
a.mainloop()

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 21:54:15 552 分享 版权
1 条回答
写回答
取消 提交回答
  • 您可以在代码中使用self.update()使弹出窗口出现。

    import tkinter as tk
    import time
    
    class GUI(tk.Tk):
        def __init__(self):
            super().__init__()
    
            self.button1 = tk.Button(text="Start", command=self.make_green)
            self.button1.pack()
    
    
        def popup(self):
            tl = tk.Toplevel(self)
            tl.transient()
            tk.Label(tl, text="Painting green").pack()
            self.update()
            tl.grab_set()
            return tl
    
        def make_green(self):
            wait_popup = self.popup()
            time.sleep(10)
            self.button1.config(bg="green")
            wait_popup.destroy()
    
    a = GUI()
    a.mainloop()
    

    或者您可以使用线程。

    首先从线程导入线程。

    from threading import Thread
    

    然后做一个新方法

    def thread_it(self):
        return Thread(target=self.make_green, daemon=True).start()
    

    并更新按钮的命令

    self.button1 = tk.Button(text="Start", command=self.thread_it)
    

    回答来源:stackoverflow

    2020-03-24 21:54:23
    赞同 展开评论
问答分类:
问答地址: