Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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_Canvas_Tkinter_Binding - Fatal编程技术网

Python Tkinter绑定子部件

Python Tkinter绑定子部件,python,canvas,tkinter,binding,Python,Canvas,Tkinter,Binding,我制作了一个tkinter窗口,该窗口由两个可滚动的Canvas分隔,其中包含小部件。 两个画布小部件都有自己的滚动条,我已经将每个画布上的事件绑定到滚动条 这导致,如果鼠标位于画布上,则滚动效果良好,但如果鼠标位于画布内的小部件上,则不会激活事件处理程序。 我已尝试使用bind\u all进行绑定: canvas1.bind_all("<MouseWheel>",scrollcanvas1) canvas2.bind_all("<MouseWheel>",scrollc

我制作了一个tkinter窗口,该窗口由两个可滚动的
Canvas
分隔,其中包含小部件。 两个画布小部件都有自己的滚动条,我已经将每个画布上的
事件绑定到滚动条

这导致,如果鼠标位于画布上,则滚动效果良好,但如果鼠标位于画布内的小部件上,则不会激活事件处理程序。 我已尝试使用
bind\u all
进行绑定:

canvas1.bind_all("<MouseWheel>",scrollcanvas1)
canvas2.bind_all("<MouseWheel>",scrollcanvas2)
它工作得很好,但是如果画布中的小部件填满它,事情就会变得复杂,因此它不会留下任何画布表面来将鼠标放在上面并激活处理程序

那么,有没有办法将处理程序绑定到所有画布子窗口小部件来实现这一点


谢谢。

我认为最好的解决方案是使用
bind\u all
。在绑定函数中,首先需要确定鼠标在哪个画布上(和/或哪个画布具有焦点),然后可以滚动该画布

下面是一个示例,说明如何设置多个滚动画布并将鼠标滚轮绑定到每个画布。我这样做的方法是在鼠标输入包含画布的框架时更改
bind\u all

我把它设置成每一个框架和画布都会随着窗口的打开而展开,你可以看到,无论你的鼠标在框架内的什么地方,里面的一切都会很好地滚动

试试这个代码,让我知道你的想法

import tkinter as tk

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

def on_mousewheel1(event):
    canvas.yview_scroll(int(-1*(event.delta/120)), "units")

def on_mousewheel2(event):
    canvas2.yview_scroll(int(-1*(event.delta/120)), "units")

def set_binds_canvas1(event):
    frame.bind_all("<MouseWheel>", on_mousewheel1)

def set_binds_canvas2(event):
    frame2.bind_all("<MouseWheel>", on_mousewheel2)

# setup for first canvas
frame = tk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)
frame.grid(row=0,column=0, sticky="nsew")

canvas = tk.Canvas(frame, scrollregion=(0,0,500,500))
canvas.grid(row=0, column=0, sticky="nsew")

lbl = tk.Label(canvas, text="Some random text!")
entry = tk.Entry(canvas)
txt = tk.Text(canvas)

canvas.create_window((100, 100), window=lbl)
canvas.create_window((100, 50), window=entry)
canvas.create_window((350, 400), window=txt)

vbar=tk.Scrollbar(frame, orient="vertical")
vbar.grid(row=0, column=1, sticky="ns")
vbar.config(command=canvas.yview)
canvas.config(yscrollcommand=vbar.set)

# setup for second canvas
frame2 = tk.Frame(root)
frame2.rowconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
frame2.grid(row=0,column=1, sticky="nsew")

canvas2 = tk.Canvas(frame2, scrollregion=(0,0,500,500))
canvas2.grid(row=0, column=0, sticky="nsew")

lbl2 = tk.Label(canvas2, text="Some random text!")
entry2 = tk.Entry(canvas2)
txt2 = tk.Text(canvas2)

canvas2.create_window((100, 100), window=lbl2)
canvas2.create_window((100, 50), window=entry2)
canvas2.create_window((350, 400), window=txt2)

vbar2=tk.Scrollbar(frame2, orient="vertical")
vbar2.grid(row=0, column=1, sticky="ns")
vbar2.config(command=canvas2.yview)
canvas2.config(yscrollcommand=vbar2.set)

frame.bind("<Enter>", set_binds_canvas1)
frame2.bind("<Enter>", set_binds_canvas2)

root.mainloop()
将tkinter作为tk导入
root=tk.tk()
rowconfigure(0,权重=1)
root.columnconfigure(0,权重=1)
root.columnconfigure(1,权重=1)
鼠标轮1上的def(事件):
canvas.yview_卷轴(int(-1*(event.delta/120)),“单位”)
鼠标滚轮2上的def(事件):
画布2.yview_卷轴(int(-1*(event.delta/120)),“单位”)
def集合绑定画布1(事件):
frame.bind_all(“,位于鼠标滚轮1上)
def集合绑定画布2(事件):
框架2.绑定所有(“,在鼠标滚轮2上)
#第一个画布的设置
frame=tk.frame(根)
frame.rowconfigure(0,权重=1)
frame.columnconfigure(0,权重=1)
frame.grid(行=0,列=0,sticky=“nsew”)
canvas=tk.canvas(frame,scrollregion=(0,0500500))
canvas.grid(行=0,列=0,sticky=“nsew”)
lbl=tk.Label(canvas,text=“一些随机文本!”)
entry=tk.entry(画布)
txt=tk.Text(画布)
canvas.create_window((100100),window=lbl)
canvas.create_window((100,50),window=entry)
canvas.create_窗口((350400),window=txt)
vbar=tk.滚动条(框架,方向=“垂直”)
vbar.grid(行=0,列=1,sticky=“ns”)
vbar.config(命令=canvas.yview)
canvas.config(yscrollcommand=vbar.set)
#第二个画布的设置
frame2=tk.Frame(根)
frame2.rowconfigure(0,权重=1)
frame2.columnconfigure(0,权重=1)
frame2.grid(行=0,列=1,sticky=“nsew”)
canvas2=tk.Canvas(frame2,scrollregion=(0,0500500))
canvas2.grid(行=0,列=0,sticky=“nsew”)
lbl2=tk.Label(canvas2,text=“一些随机文本!”)
entry2=tk.Entry(canvas2)
txt2=tk.Text(canvas2)
canvas2.create_window((100100),window=lbl2)
canvas2.create_window((100,50),window=entry2)
canvas2.create_window((350400),window=txt2)
vbar2=tk.Scrollbar(frame2,orient=“vertical”)
vbar2.grid(行=0,列=1,sticky=“ns”)
vbar2.config(命令=canvas2.yview)
canvas2.config(yscrollcommand=vbar2.set)
frame.bind(“,set\u binds\u canvas1)
frame2.bind(“,set\u binds\u canvas2)
root.mainloop()

你已经很好地解释了这个问题,但是如果你能添加一个小的来说明这个问题,那就更好了。是的,就是这样,昨天我尝试了更多的方法,我使用了
Enter
Leave
事件,而不是
Motion
事件,它按照预期工作。谢谢你的帮助!
import tkinter as tk

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

def on_mousewheel1(event):
    canvas.yview_scroll(int(-1*(event.delta/120)), "units")

def on_mousewheel2(event):
    canvas2.yview_scroll(int(-1*(event.delta/120)), "units")

def set_binds_canvas1(event):
    frame.bind_all("<MouseWheel>", on_mousewheel1)

def set_binds_canvas2(event):
    frame2.bind_all("<MouseWheel>", on_mousewheel2)

# setup for first canvas
frame = tk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)
frame.grid(row=0,column=0, sticky="nsew")

canvas = tk.Canvas(frame, scrollregion=(0,0,500,500))
canvas.grid(row=0, column=0, sticky="nsew")

lbl = tk.Label(canvas, text="Some random text!")
entry = tk.Entry(canvas)
txt = tk.Text(canvas)

canvas.create_window((100, 100), window=lbl)
canvas.create_window((100, 50), window=entry)
canvas.create_window((350, 400), window=txt)

vbar=tk.Scrollbar(frame, orient="vertical")
vbar.grid(row=0, column=1, sticky="ns")
vbar.config(command=canvas.yview)
canvas.config(yscrollcommand=vbar.set)

# setup for second canvas
frame2 = tk.Frame(root)
frame2.rowconfigure(0, weight=1)
frame2.columnconfigure(0, weight=1)
frame2.grid(row=0,column=1, sticky="nsew")

canvas2 = tk.Canvas(frame2, scrollregion=(0,0,500,500))
canvas2.grid(row=0, column=0, sticky="nsew")

lbl2 = tk.Label(canvas2, text="Some random text!")
entry2 = tk.Entry(canvas2)
txt2 = tk.Text(canvas2)

canvas2.create_window((100, 100), window=lbl2)
canvas2.create_window((100, 50), window=entry2)
canvas2.create_window((350, 400), window=txt2)

vbar2=tk.Scrollbar(frame2, orient="vertical")
vbar2.grid(row=0, column=1, sticky="ns")
vbar2.config(command=canvas2.yview)
canvas2.config(yscrollcommand=vbar2.set)

frame.bind("<Enter>", set_binds_canvas1)
frame2.bind("<Enter>", set_binds_canvas2)

root.mainloop()