2014-10-20 24 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