我希望能够切换出框架中的画布项目 - 我第一次调用此事件时,它似乎有效,但随后不再响应事件。
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 :(得分: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