2014-10-20 109 views
0

我希望能夠切換出框架中的畫布項 - 我第一次調用此事件時,它似乎可以正常工作,但隨後不再響應事件。Tkinter - 關掉網格中的畫布

def switchCanvas(event): 
    global state 
    global myCanvas 
    if (state == 0): 
     print("white background")  
     myCanvas = Canvas(rootFrame, bg="white",scrollregion=(0, 0, 10000, 10000)) 
    if (state == 1): 
     print("black background") 
    myCanvas = Canvas(rootFrame, bg="black",scrollregion=(0, 0, 10000, 10000)) 
    state = 1^state 
    myCanvas.grid(row=0,column=0,sticky=(N, W, E, S)) 

沒有最後的.grid命令,Python窗口響應事件但不更新。有沒有人知道爲什麼這些事件沒有被註冊?我正在使用Python3。

+0

您的代碼顯示創建第二個畫布,但這與「切換」不同,因爲您最終會得到兩個畫布小部件。 「切換」意味着你刪除一個並用另一個替換它。 – 2014-10-20 21:23:05

回答

2

您發佈的內容少於一個最小示例,沒有上下文可以自信地回答,但我會嘗試。首先,這是一個(未經測試的)你的func的改進版本,具有相同的缺陷。

def switchCanvas(event): 
    global myCanvas 
    bgcolors = ('white', 'black') 
    print(bgcolors[state], "background") 
    myCanvas = Canvas(rootFrame, bg=bgcolors[state], scrollregion=(0, 0, 10000, 10000)) 
    state = 1^state 
    myCanvas.grid(row=0,column=0,sticky=(N, W, E, S)) 

在您的未發佈的代碼中,您首先綁定了名爲'myCanvas'的Canvas小部件。然後你將它綁定到網格單元格(0,0)。當事件第一次觸發時,您將'myCanvas'重新綁定到不可見的第二個畫布。第一個仍然與細胞結合,就是你所看到的。如果你在那裏停下來,你可以將第一個畫布視爲「事件未被註冊」,儘管這是事實,因爲效果是不可見的。當您將第二個畫布重新綁定到單元格時,我相信不會有第一個畫布的引用,並且會收集垃圾。爲什麼這會禁用事件處理,如果確實如此,我不能看到事件綁定代碼。

但是,我相信你的問題將消失,而不是創建一個新的畫布,你只需清除myCanvas並切換其背景顏色。

def switchCanvas(event): 
    bgcolors = ('white', 'black') 
    print(bgcolors[state], "background") 
    myCanvas.delete(*myCanvas.find_all()) 
    myCanvas['bg'] = bgcolors[state] 
    state = 1^state 
+0

我遇到了這個問題,因爲我試圖與彈出的tkinter窗口進行交互,但是你是對的 - 這對我的目的非常好。我正在創建一個更完整的示例,但它需要我一段時間(對於tkinter /不是Python專家來說很新) - 但是在完成之前您已經粉碎了它。 關於垃圾收集的部分非常好 - 我將不得不考慮處理多個框架。再次感謝! – trayres 2014-10-20 22:14:54

+0

控件不會被垃圾收集,它們會一直保留在內存中,直到它們被銷燬。 – 2014-10-20 23:02:08

+0

我還沒有嘗試過,但'myCanvas.delete('all')'也應該清除。 – 2014-10-20 23:58:22