2011-10-27 39 views
1

我已經搜索了相當廣泛的,並沒有找到答案。如何更新Tkinter窗口的屏幕(畫布)

我已經查明並減少了我的問題到這個例子。

from Tkinter import * 

class A: 
    def __init__(self): 
     self.var = True 

obj = A() 

def meth(): 
    obj.var = False 
    paintGui() 

def paintGui():  
    master = Tk() 
    w = Canvas(master, width=200, height=100) 
    w.pack() 
    w.create_rectangle(50, 25, 150, 75, fill="blue", tags="rect") 

    btn = Button(master, text="Cerrar Mesa",command=meth) 
    btn.pack(side=BOTTOM) 

    if obj.var == False: 
     w.itemconfig("rect", fill="red") 

    mainloop() 

paintGui() 

正如你所看到的矩形有一個條件itemconfig

paintGui()meth()只是表明該代碼工作,當obj.varFalse則轉向紅色。

我的問題是,原來的窗口(它下面的那個窗口)仍然是藍色的。

我可以殺死原來的窗口並離開新窗口,但這不應該是必要的。

所以我有2個問題:

  • 我如何解決這個問題?

我試過after()update_idletaskes但他們似乎沒有工作,雖然我可能使用不正確。

  • 這裏有什麼問題?

我說tkinter被置於循環中。當我更改var的值時,不應該循環並重新繪製屏幕並將obj.var == False評估爲True

回答

5

每當您撥打paintGui時,它都會創建一個全新的窗口。這是因爲您打電話Tk(),創建新的小部件,並運行新的mainloop。這些東西只需要發生一次,所以請將它們從paintGui函數中取出。

您的代碼的這個最小修改版本做你想要的。

from Tkinter import * 

class A: 
    def __init__(self): 
     self.var = True 

obj = A() 

def meth(): 
    obj.var = False 
    paintGui() 

def paintGui():  
    if obj.var == False: 
     w.itemconfig("rect", fill="red") 


master = Tk() 
w = Canvas(master, width=200, height=100) 
w.pack() 
w.create_rectangle(50, 25, 150, 75, fill="blue", tags="rect") 

btn = Button(master, text="Cerrar Mesa",command=meth) 
btn.pack(side=BOTTOM)  
mainloop() 
+0

非常感謝。這幾乎解決了它。 +1並接受答案! – Trufa