首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Tkinter根窗口解除每个绑定

如何从Tkinter根窗口解除每个绑定
EN

Stack Overflow用户
提问于 2017-09-22 18:47:27
回答 2查看 1.3K关注 0票数 3

因此,我在Tkinter中有一个应用程序,它在第一个屏幕上有很多按钮,当你按下一个按钮时,你会传递到一个新的“窗口”中(基本上销毁所有的小部件,绘制‘窗口’所需的小部件)。有一个标准的函数,它使用一些命令来销毁根目录上的每个子函数。我想添加一些代码,这些代码可以解除根目录中的所有绑定。在特定小部件上的绑定会被销毁,但是根目录上绑定的绑定会留在那里并导致错误。

下面是销毁小部件的代码。

代码语言:javascript
复制
@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)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-22 18:55:19

在Tkinter没有什么可以做你想做的事。您的应用程序将需要跟踪它想要删除的绑定。

尽管如此,取决于你真正的问题有多复杂,可能还有其他的解决方案。例如,不要绑定到根窗口,而是绑定到自定义绑定标记(也称为绑定标记或bindtag)。然后,您需要将该标记添加到每个小部件中,以启用绑定,并从任何现有小部件中删除标记,从而有效地禁用绑定。

票数 5
EN

Stack Overflow用户

发布于 2022-08-05 16:23:08

我知道我已经很晚了,但是,如果您完成代码并用下面的函数替换每个widget.bind,这个函数是从here获取和修改的。

代码语言:javascript
复制
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的属性来跟踪每个绑定,该属性包含事件和函数。

例如:

代码语言:javascript
复制
label.bind('<Button-1>', label.destroy)

将成为:

代码语言:javascript
复制
bindWidget(label, '<Button-1>', func=label.destroy)

这样做之后,您可以编写一个简单的函数来删除所有绑定和小部件:

代码语言:javascript
复制
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 = {}

这种方法只有两个注意事项。

  1. 时间
    • 您将不得不遍历代码来替换每个widget.bind,如果您有大量的绑定,则需要花费大量的时间。

  2. 可读性
    • bindWidget(label, '<Button-1>', func=label.destroy)的可读性和清晰度不如label.bind('<Button-1>', label.destroy)

编辑8/11/2022

或者,您可以销毁整个窗口并像这样重新创建它:

代码语言:javascript
复制
window.destroy()
window = Tk()

但是,我不确定创建一个完整的Tcl解释器是否很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46371372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档