Tkinter - 切换出网格中的画布

时间:2014-10-20 18:40:18

标签: python-3.x 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。

1 个答案:

答案 0 :(得分: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))

在未发布的代码中,您首先将Canvas小部件绑定到名称' myCanvas'。然后将它绑定到网格单元格(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