因此,我在Tkinter中有一个应用程序,它在第一个屏幕上有很多按钮,当你按下一个按钮时,你会传递到一个新的“窗口”中(基本上销毁所有的小部件,绘制‘窗口’所需的小部件)。有一个标准的函数,它使用一些命令来销毁根目录上的每个子函数。我想添加一些代码,这些代码可以解除根目录中的所有绑定。在特定小部件上的绑定会被销毁,但是根目录上绑定的绑定会留在那里并导致错误。
下面是销毁小部件的代码。
@staticmethod
def clear():
for widget in guihandle.root.winfo_children():
widget.destroy()
@staticmethod
def set(db,table):
guihandle.clear()
curW = Window(db,table)
guihandle.current_Window = curW
curW.initialize()
guihandle.windows.push(curW)(是的,我使用sqlite3数据库制作了基本图形用户界面:P)
发布于 2017-09-22 18:55:19
在Tkinter没有什么可以做你想做的事。您的应用程序将需要跟踪它想要删除的绑定。
尽管如此,取决于你真正的问题有多复杂,可能还有其他的解决方案。例如,不要绑定到根窗口,而是绑定到自定义绑定标记(也称为绑定标记或bindtag)。然后,您需要将该标记添加到每个小部件中,以启用绑定,并从任何现有小部件中删除标记,从而有效地禁用绑定。
发布于 2022-08-05 16:23:08
我知道我已经很晚了,但是,如果您完成代码并用下面的函数替换每个widget.bind,这个函数是从here获取和修改的。
def bindWidget(widget: Widget, event, all:bool=False, func=None):
# https://stackoverflow.com/a/226141/19581763
'''Set or retrieve the binding for an event on a widget'''
try:
_ = widget.__dict__['bindings']
except KeyError:
has_binding_key = False
else:
has_binding_key = True
if not has_binding_key:
setattr(widget, 'bindings', dict())
if func:
if not all:
widget.bind(event, func)
else:
widget.bind_all(event, func)
widget.bindings[event] = func
else:
return(widget.bindings.setdefault(event, None))函数将通过设置一个名为bindings的属性来跟踪每个绑定,该属性包含事件和函数。
例如:
label.bind('<Button-1>', label.destroy)将成为:
bindWidget(label, '<Button-1>', func=label.destroy)这样做之后,您可以编写一个简单的函数来删除所有绑定和小部件:
def clear(self): # Self will be your Tk() instance
"""Clears everything on the window, including bindings"""
for child in self.winfo_children():
child.destroy()
if not hasattr(self, 'bindings'):
self.bindings = {}
for event, func in self.bindings.items():
self.unbind_all(event)
self.bindings = {}这种方法只有两个注意事项。
widget.bind,如果您有大量的绑定,则需要花费大量的时间。bindWidget(label, '<Button-1>', func=label.destroy)的可读性和清晰度不如label.bind('<Button-1>', label.destroy)编辑8/11/2022
或者,您可以销毁整个窗口并像这样重新创建它:
window.destroy()
window = Tk()但是,我不确定创建一个完整的Tcl解释器是否很好。
https://stackoverflow.com/questions/46371372
复制相似问题