Привязать колесо мыши к двум холстам, но только к одной работе - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь привязать колесо мыши к холсту прокрутки в двух кадрах.Но я не могу понять это правильно!Только в одном кадре колесо мыши привязано правильно.

Где я допустил ошибку?Разве не принято давать каждому, позвольте мне назвать 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()

MainGUI:

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")

    #[...]

Системный графический интерфейс (в основном одинаковый):

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")

    #[...]

1 Ответ

0 голосов
/ 25 мая 2018

вот полноценный пример с использованием вашего кода:

import tkinter as tk
import tkinter.ttk as ttk

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") 

        # must configure canvas to update scrollbar when scrolled
        self.main_canvas.configure(yscrollcommand=self.vsb.set)

        # add some content so can see scrolling
        self.main_canvas.create_line(0,0,200,500, fill='red')

        # tell canvas the scrollable region (used bbox(tk.ALL) to get everything)
        self.main_canvas.configure(scrollregion=self.main_canvas.bbox(tk.ALL))

        self.main_canvas.bind("<MouseWheel>", self._on_mousewheel)
        self.main_canvas.bind("<Button-4>", self._onmousewheel)
        self.main_canvas.bind("<Button-5>", self._onmousewheel)

    def _on_mousewheel(self, event):
        if event.num == 4 or event.delta == 120:
            self.main_canvas.yview_scroll(-1, "units")
        elif event.num == 5 or event.delta == -120:
            self.main_canvas.yview_scroll(1, "units")

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.configure(yscrollcommand=self.vsb.set)

        self.system_canvas.create_line(0,0,200,500, fill='red')
        self.system_canvas.configure(scrollregion=self.system_canvas.bbox(tk.ALL))

        self.system_canvas.bind("<MouseWheel>", self._on_mousewheel)
        self.system_canvas.bind("<Button-4>", self._onmousewheel)
        self.system_canvas.bind("<Button-5>", self._onmousewheel)

    def _on_mousewheel(self, event):
        if event.num == 4 or event.delta == 120:
            self.system_canvas.yview_scroll(-1, "units")
        elif event.num == 5 or event.delta == -120:
            self.system_canvas.yview_scroll(1, "units")

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=tk.N+tk.E+tk.S+tk.W)  

        self.test_1 = MainFrame(self.main_gui)
        self.test_1.grid(row=0, column=0, sticky="NESW") 

        self.test_2 = SystemFrame(self.systems_gui)
        self.test_2.grid(row=0, column=0, sticky="NESW") 

master = tk.Tk()
gui = MyFirstGUI(master)
master.mainloop()

обратите внимание, что я добавил вызовы, чтобы сообщить холсту обновить полосы прокрутки (вы только сказали полосам прокрутки обновить холст) и яТакже добавлен вызов, сообщающий холсту, какая область прокручиваема. Если вы вносите какие-либо изменения / добавляете виджеты, которые изменяют область, которую вы хотите видеть, вам нужно будет обновить это снова (каждый раз, когда изменяется внутреннее содержимое), я также добавил некоторое содержимое, чтобыВы могли видеть прокрутку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...