Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在tkinter中,如何使自定义子部件接收鼠标滚动事件?_Python_User Interface_Tkinter - Fatal编程技术网

Python 在tkinter中,如何使自定义子部件接收鼠标滚动事件?

Python 在tkinter中,如何使自定义子部件接收鼠标滚动事件?,python,user-interface,tkinter,Python,User Interface,Tkinter,我无法确定如何使自定义小部件接收鼠标滚动事件。如果绑定到根窗口,则会发生通知。如果我绑定到根窗口的子窗口而不是我的小部件(这里是一个简单的列表框),那么也会出现通知(当我移动控制盘时,可以看到列表移动)。我忽略了什么 从未调用roll()的示例代码: #!/usr/bin/python3 from tkinter import * from tkinter.ttk import * class CustomWidget(Frame): def __init__(self, parent

我无法确定如何使自定义小部件接收鼠标滚动事件。如果绑定到根窗口,则会发生通知。如果我绑定到根窗口的子窗口而不是我的小部件(这里是一个简单的列表框),那么也会出现通知(当我移动控制盘时,可以看到列表移动)。我忽略了什么

从未调用roll()的示例代码:

#!/usr/bin/python3
from tkinter import *
from tkinter.ttk import *

class CustomWidget(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.width = 200
        self.height = 200
        self.canvas = Canvas(self, width=200, height=200)
        self.canvas.config(background='red')
        self.canvas.pack()

        self.bind('<MouseWheel>', self.roll)
        self.bind('<Button-4>', self.roll)
        self.bind('<Button-5>', self.roll)

    def roll(self, event):
        print("detected mouse roll!");

if __name__ == "__main__":
    root = Tk()
    root.wm_title("TestRoot")

    sb = Scrollbar(root, orient=VERTICAL)
    lb = Listbox(root, yscrollcommand=sb.set)
    sb.config(command=lb.yview)
    cw = CustomWidget(root)

    for char in list("abcdefghijklmnopqrstuvwxyz"):
        lb.insert(END, char)

    cw.pack()
    lb.pack()
    sb.pack()

    root.update()
    root.mainloop()
#/usr/bin/python3
从tkinter进口*
从tkinter.ttk导入*
类CustomWidget(框架):
定义初始化(自身,父级):
帧。\uuuu初始化(自,父)
自宽=200
自身高度=200
self.canvas=canvas(self,宽度=200,高度=200)
self.canvas.config(background='red')
self.canvas.pack()
自我绑定(“”,自我滚动)
自我绑定(“”,自我滚动)
自我绑定(“”,自我滚动)
def辊(自身、事件):
打印(“检测到鼠标滚动!”);
如果名称=“\uuuuu main\uuuuuuuu”:
root=Tk()
root.wm_标题(“TestRoot”)
sb=滚动条(根,方向=垂直)
lb=Listbox(根,yscrollcommand=sb.set)
sb.config(命令=lb.yview)
cw=自定义小部件(根)
对于列表中的字符(“abcdefghijklmnopqrstuvxyz”):
lb.插入(结束,字符)
cw.pack()
lb.pack()
某人打包
root.update()
root.mainloop()

因此,为了让帧接收事件,它需要有焦点。您可以对其调用
frame.set_focus()
,但一旦您赋予另一个小部件焦点,它将无法工作。为了解决这个问题,我们可以将
绑定到帧并将焦点设置到帧,但是画布占据了帧的整个大小,因此您需要将
事件绑定到该帧

添加:

self.canvas.bind("<Button-1>", lambda _: self.focus_set())
self.canvas.bind(“,lambda:self.focus\u set())
CustomWidget中的其他绑定之后。只要小部件有焦点,您的绑定就会工作,当用户单击它时就会工作(类似于列表框的工作方式)。如果画布从来没有它的框架那么大,您可能需要向框架添加另一个
绑定