当前位置: 首页 > 面试题库 >

如何将事件传递给父窗口小部件

林雅畅
2023-03-14
问题内容

在Tkinter中是否可以将事件直接传递给父窗口小部件?

我有一个画布,该画布被其他画布的网格覆盖(是复数吗?),我使用parent_canvas.create_window()方法添加了该画布。我希望某些事件(例如鼠标释放事件)由父画布处理。

如果仅将事件绑定到父方法,则event.xevent.y坐标相对于捕获事件的子画布而言。


问题答案:

Tkinter不会将事件传递给父窗口小部件。但是,您可以通过使用绑定标签(或“ bindtags”)来模拟效果。

我能给出的最简短的解释是:将绑定添加到窗口小部件时,不是在将绑定添加到窗口小部件,而是将其绑定到“绑定标签”。该标签与小部件具有相同的名称,但实际上不是小部件。

窗口小部件具有绑定标签的列表,因此,当窗口小部件上发生事件时,将按顺序处理每个标签的绑定。通常,顺序为:

  1. 实际小部件上的绑定
  2. 小部件类上的绑定
  3. 包含窗口小部件的顶级窗口小部件上的绑定
  4. 对“所有”的绑定

请注意,该列表中没有任何地方是“父窗口小部件上的绑定”。

您可以按此顺序插入自己的绑定标签。因此,例如,您可以将主画布添加到每个子画布的绑定标签中。当您绑定到任何一个时,该函数都会被调用。因此,似乎事件已传递给父级。

这是一些用python
2.7编写的示例代码。如果单击灰色正方形,则会看到打印出的两件事,这表明子画布上的装订和主画布上的装订同时发生。如果单击一个粉红色的正方形,则会看到子画布绑定被触发,但是它阻止了父绑定的触发。

这样,所有按钮单击实际上都“传递”给了父级。子画布可以控制父级是否应处理事件,如果要“中断事件处理的链”,则返回“中断”。

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.main = tk.Canvas(self, width=400, height=400, 
                              borderwidth=0, highlightthickness=0,
                              background="bisque")
        self.main.pack(side="top", fill="both", expand=True)

        # add a callback for button events on the main canvas
        self.main.bind("<1>", self.on_main_click)

        for x in range(10):
            for y in range(10):
                canvas = tk.Canvas(self.main, width=48, height=48, 
                                   borderwidth=1, highlightthickness=0,
                                   relief="raised")
                if ((x+y)%2 == 0):
                    canvas.configure(bg="pink")

                self.main.create_window(x*50, y*50, anchor="nw", window=canvas)

                # adjust the bindtags of the sub-canvas to include
                # the parent canvas
                bindtags = list(canvas.bindtags())
                bindtags.insert(1, self.main)
                canvas.bindtags(tuple(bindtags))

                # add a callback for button events on the inner canvas
                canvas.bind("<1>", self.on_sub_click)


    def on_sub_click(self, event):
        print "sub-canvas binding"
        if event.widget.cget("background") == "pink":
            return "break"

    def on_main_click(self, event):
        print "main widget binding"

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack (fill="both", expand=True)
    root.mainloop()


 类似资料:
  • 问题内容: 我想创建一个应用程序,其中应处理某些事件,就像它们被传递到父容器一样。例如,我有一个包含的。顶部立即实现了鼠标按下和拖动。为了使事件看起来像是到达的,而不是标签本身,我需要做什么。(更改源对象很重要) 是否有比实际实现事件并在父级中复制事件更好的解决方案?(在某些对象> 5个孩子之后,这将变得乏味)。 问题答案: 在事件侦听器中,您可以将事件调度到父组件。 作为事件处理函数参数: 但是

  • 我正在尝试从Flutter中的父部件传递堆栈的高度,但我无法做到。请帮助我找到解决方案,我将把我的代码作为参考。 父小工具 子部件 如何将堆栈的高度传递给SVGPicture。

  • 我是Flutter和Dart的新手。我有一些来自基于api json的数据,数据的变量称为。我从官方flutter留档中获取了这个示例代码,我希望能够使用变量并替换字符串文本,如下所示: 但是,我在第行标题中遇到了一个错误:const Text(data[index][“name]),,错误是类型常量创建的参数必须是常量表达式。此错误来自Android Studio本身(版本3.2) 但当我使用这

  • 所以我一直在尝试编写一个简单的插件来删除一个块。放置后5秒或10滴答声。但我遇到了一些问题。当我放置一个块来测试它时,我得到了下面所述的错误,因为我在编程方面不是很有经验,我不知道如何修复它。我们将不胜感激。 我的错误是: 下面是我的代码。

  • 本文向大家介绍怎样将事件传递给子组件?相关面试题,主要包含被问及怎样将事件传递给子组件?时的应答技巧和注意事项,需要的朋友参考一下 这道题出的有问题。 一般情况下我们父组件向子组件传递的不是事件,而是事件处理函数

  • 问题内容: 我已经在子组件的窗体上创建了。使用jquery ajax方法提交该表单后,我将以json格式检索一些数据。我想将该数据置于父组件的状态。那么,react.js中是否有任何方法可以将值或数据从子组件传递到其父组件? 谢谢.. 问题答案: 在没有某种Flux实现的情况下执行此操作的方法是在父元素上创建一个函数来处理来自子级的响应/数据,并将该函数作为道具传递。然后从孩子那里调用该函数。像这