Python 在tkinter中,如何使自定义子部件接收鼠标滚动事件?
我无法确定如何使自定义小部件接收鼠标滚动事件。如果绑定到根窗口,则会发生通知。如果我绑定到根窗口的子窗口而不是我的小部件(这里是一个简单的列表框),那么也会出现通知(当我移动控制盘时,可以看到列表移动)。我忽略了什么 从未调用roll()的示例代码: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
#!/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中的其他绑定之后。只要小部件有焦点,您的绑定就会工作,当用户单击它时就会工作(类似于列表框的工作方式)。如果画布从来没有它的框架那么大,您可能需要向框架添加另一个
绑定