Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tkinter-删除和设置小部件的边框_Tkinter - Fatal编程技术网

Tkinter-删除和设置小部件的边框

Tkinter-删除和设置小部件的边框,tkinter,Tkinter,我试图在回调开始时删除文本小部件的边框,然后根据该回调其余部分的结果,如果某个变量具有某个值,我想将边框设置为红色 下面是我尝试过的,但是一旦边框设置为红色,它就永远不会在回调开始时被擦除 from tkinter import * import time class GUI: def __init__(self, master): self.cnt = 0; self.master = master self.test_butt

我试图在回调开始时删除文本小部件的边框,然后根据该回调其余部分的结果,如果某个变量具有某个值,我想将边框设置为红色

下面是我尝试过的,但是一旦边框设置为红色,它就永远不会在回调开始时被擦除


from tkinter import *
import time



class GUI:

    def __init__(self, master):
        self.cnt = 0;
        self.master = master
        self.test_button = Button(self.master, command=self.tb_click)
        self.test_button.configure(
            text="Calc", background="Grey",
            padx=50
            )
        self.test_button.pack(side=TOP)

        self.test_text = Text(self.master)
        self.test_text.configure(background ="White",height = 2, width = 15)
        self.test_text.pack(side=TOP)



    def tb_click(self):
        self.test_text.configure(highlightthickness = 0)

        self.cnt += 1
        time.sleep(3) #simulate long running process

        if(self.cnt>1): #check result of long running process
            self.test_text.configure(highlightbackground = "red")
            self.test_text.configure(highlightthickness = 4)



root = Tk()
root.title("Test Border")
main_ui = GUI(root)
root.mainloop()

当您按下按钮时,
mainloop()
运行您的函数,并等待函数结束,然后重新绘制窗口和窗口中的所有小部件。这样,对于所有更改,它只需重新绘制一次。它需要更少的时间,而且窗口不会闪烁

但使用
root.update()
可以强制
mainloop()
更早地重新绘制窗口

self.test_text.configure(highlightthickness=0)
root.update()

成功了!您知道这可能会导致哪些潜在问题吗?例如,如果我尝试从另一个线程更新root?大多数GUI不喜欢在线程中工作-它们应该在一个线程中运行-并不总是必须是主线程。若其他线程必须在GUI中更改某些内容,那个么它应该向主线程发送消息,主线程应该更改它。您可以使用模块发送到主线程,或者简单地使用全局变量。主线程需要使用
root.after(毫秒,函数名)
定期执行函数,该函数将从线程获取消息并更改GUI。