【发布时间】:2018-05-25 11:21:37
【问题描述】:
我尝试将鼠标滚轮绑定到两个框架中的滚动画布。但我做不到!仅在一帧中鼠标滚轮被正确绑定。
我在哪里犯错了?给每个,让我称之为 CustomWidget 并自己绑定到 MouseWheel 不是很常见吗?
我必须以任何方式解除绑定吗?如果是,我怎样才能将它与我的“MyFirstGUI”类解除绑定?我很难找到合适的“自我”。
绑定通常适用于一个类。如果我在窗口中显示 SystemsGUI 时滚动鼠标滚轮,则 MainGUI 会滚动。
这是我的代码的摘录:
from tkinter import *
import tkinter.ttk as ttk
class MyFirstGUI(object):
def __init__(self, master):
self.master = master
self.gui_control = ttk.Notebook(master)
self.main_gui = ttk.Frame(self.gui_control, borderwidth=0)
self.systems_gui = ttk.Frame(self.gui_control, borderwidth=0)
self.gui_control.add(self.main_gui, text='Main')
self.gui_control.add(self.systems_gui, text='Systems')
self.gui_control.grid(column=1,row=1, columnspan=9, rowspan=50,sticky=N+E+S+W)
self.test_1 = Main.MainFrame(self.main_gui)
self.test_1.grid(row=0, column=0, sticky="NESW")
self.test_2 = Systems.SystemFrame(self.systems_gui)
self.test_2.grid(row=0, column=0, sticky="NESW")
#[...]
master.mainloop()
主界面:
class MainFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.main_canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0)
self.main_canvas.grid(row=0,column=0, sticky="NESW")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.main_canvas.yview)
self.vsb.grid(row=0,column=1, sticky="NS")
self.main_canvas.bind_all("<MouseWheel>", self._on_mousewheel)
def _on_mousewheel(self, event):
self.main_canvas.yview_scroll(int(-1*(event.delta/120)), "units")
#[...]
系统 GUI(基本相同):
class SystemFrame(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
self.system_canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0)
self.system_canvas.grid(row=0,column=0, sticky="NESW")
self.vsb = tk.Scrollbar(self, orient="vertical", command=self.system_canvas.yview)
self.vsb.grid(row=0,column=1, sticky="NS")
self.system_canvas.bind_all("<MouseWheel>", self._on_mousewheel)
def _on_mousewheel(self, event):
self.system_canvas.yview_scroll(int(-1*(event.delta/120)), "units")
#[...]
【问题讨论】:
-
你不应该使用
bind_all,bind在你想要的小部件的实例中工作,bind_class在类的所有实例上工作,bind_all在你的任何地方都工作应用 -
感谢您的回答。不幸的是,当我使用 bind_class 时,两个画布都不会滚动了。
-
我特别告诉你,你应该使用
bind我把其余的放在那里解释为什么它们不同。 -
为什么要定义 2 个相同的类?您应该定义 1 个类,并创建它的 2 个实例。
-
与绑定结果相同。仅当我使用 bind_all 时才有效。我不明白。任何地方都必须有另一个错误。
标签: python python-3.x class tkinter widget