Есть ли способ дать аргумент события? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь создать класс рамки прокрутки, но события все еще являются новыми вещами для меня.

Итак, моя структура в порядке, но когда я пытаюсь создать событие из колесо мыши я получаю ошибку, которую я пропустил, чтобы дать аргумент "событие". Я понимаю это, но я не понимаю, какой тип аргумента мне нужно разместить.

Из поисков Google я получил несколько ответов, но код не помещается в класс, и когда я пытаюсь его разместить в В моем классе я получаю сообщение об ошибке, говоря, что я забыл дать аргумент события.

Я читаю где-то, если я установлю его с lambda , тогда это исправит ошибку, но я получаю другую ошибку, которая говорит мне, что лямбда не принимает никаких аргументов, но один приводится ...

Я не прошу решить проблему, если я получу документальный фильм о том, как эти события работают, тогда это будет очень полезно. Или, может быть, кто-то может объяснить мне, как обращаться с этим внутри классов, потому что я нашел некоторую информацию о том, как работают события, но только общие вещи.

Мой тестовый код здесь:

from tkinter import Tk, Frame, Canvas, Scrollbar, Grid
from tkinter import Label
from tkinter.ttk import Sizegrip

root = Tk()
appWidth = 500
appHeight = 300
appError = "[ ERROR ] >> "

class ASI:
    def Extend(master=None, row=0, column=0):
        if master != None:
            Grid.rowconfigure(master, row, weight=1)
            Grid.columnconfigure(master, column, weight=1)
        else:
            print(f"{appError}You still need to type witch frame to expend!")

class ScrollFrame(Frame):
    def __init__(self, master, *args, **kwargs):
        #super().__init__(master, *args, **kwargs)
        super(ScrollFrame, self).__init__(master, *args, **kwargs)

        # Display container
        canvas = Canvas(self)
        ASI.Extend(canvas)

        # Scrollbar for the display container
        scrollbarV = Scrollbar(self, orient="vertical", command=canvas.yview)
        scrollbarH = Scrollbar(self, orient="horizontal", command=canvas.xview)
        resize = Sizegrip(self)

        # Frame inside the container
        self.frame = Frame(canvas, bg="red")
        ASI.Extend(self.frame)

        # Configure some settings
        # Bind the "frame" to the canvas size
        self.frame.bind(
            "<Configure>", lambda e: canvas.configure(
                scrollregion=canvas.bbox("all")
            )
        )
        # Place the "frame" inside the canvas on top left
        canvas.create_window((0,0), window=self.frame, anchor="nw")
        # Set scrollbars to the canvas functions
        canvas.configure(yscrollcommand=scrollbarV.set)
        canvas.configure(xscrollcommand=scrollbarH.set)

        # Paking
        canvas.grid(row=0, column=0, sticky="nesw")
        scrollbarV.grid(row=0, column=1, sticky="ns")
        scrollbarH.grid(row=1, column=0, sticky="we")
        resize.grid(row=1, column=1)

        # Events
        def ScrollEvent(self, event):
            self.canvas.yview_scroll(init(-1*(event.delta/120)), "units")
        def ScrollEvent_Bound(self, event):
            self.canvas.bind_all("<MouseWheel>", self.ScrollEvent)
        def ScrollEvent_UnBound(self, event):
            self.canvas.unbind_all("<MouseWheel>")

        canvas.bind("<Enter>", ScrollEvent_Bound)
        canvas.bind("<Leave>", ScrollEvent_UnBound)

        # This will solve error messages but the event will still not work
        #canvas.bind("<Enter>", lambda e:ScrollEvent_Bound)
        #canvas.bind("<Leave>", lambda e:ScrollEvent_UnBound)
        # This will show me same error like with not lambda
        #canvas.bind("<Enter>", lambda e:ScrollEvent_Bound(e))

class App:
    def __init__(self, master):
        self.master = master
        ASI.Extend(master)

        # Main App Configurations
        master.title("Scroll Frame")
        centerW = int((master.winfo_screenwidth() - appWidth) / 2)
        centerH = int((master.winfo_screenheight() - appHeight) / 2)
        master.geometry(f"{appWidth}x{appHeight}+{centerW}+{centerH}")

        # App Content
        info = ScrollFrame(master)
        info.grid(row=0, column=0, sticky="nesw")
        ASI.Extend(info)
        for i in range(30):
            if i <= 9: row = f"0{i}"
            else: row = i
            txt = f"Row: {row} // Column: 00"
            Label(info.frame, text=txt, bg="pink"
                  ).grid(row=i, column=0)

# Run if this is the main file opened
if __name__ == "__main__":
    App(root)
    root.mainloop()

Python 3.8.1 // ОС: Window (7)

1 Ответ

0 голосов
/ 23 февраля 2020

Я играл с другими примерами кода, найденными в Google, поэтому вся проблема была в ширине self . Я удалил все собственные аргументы из функций событий, и теперь все в порядке.

Обновленный код:

class ScrollFrame(Frame):
    def __init__(self, master, *args, **kwargs):
        super(ScrollFrame, self).__init__(master, *args, **kwargs)

        # Display container
        canvas = Canvas(self)
        ASI.Extend(canvas)

        # Scrollbar for the display container
        scrollbarV = Scrollbar(self, orient="vertical", command=canvas.yview)
        scrollbarH = Scrollbar(self, orient="horizontal", command=canvas.xview)

        # Frame inside the container
        self.frame = Frame(canvas)
        ASI.Extend(self.frame)

        # Configure some settings
        # Bind the "frame" to the canvas size
        self.frame.bind(
            "<Configure>", lambda e: canvas.configure(
                scrollregion=canvas.bbox("all")
            )
        )
        # Place the "frame" inside the canvas on top left
        canvas.create_window((0,0), window=self.frame, anchor="nw")
        # Set scrollbars to the canvas functions
        canvas.configure(yscrollcommand=scrollbarV.set)
        canvas.configure(xscrollcommand=scrollbarH.set)

        # Paking
        canvas.grid(row=0, column=0, sticky="nesw")
        scrollbarV.grid(row=0, column=1, sticky="ns")
        scrollbarH.grid(row=1, column=0, sticky="we")

        # Events
        def ScrollEventKey(event):
            # Arrow Left // Numpad 4
            if event.keycode == 37 or event.keycode == 100:
                canvas.xview_scroll(-1, "units")
            # Arrow Right // Numpad 6
            elif event.keycode == 39 or event.keycode == 102:
                canvas.xview_scroll(1, "units")
            # Arrow Up // Numpad 8
            elif event.keycode == 38 or event.keycode == 104:
                canvas.yview_scroll(-1, "units")
            # Arrow Down // Numpad 2
            elif event.keycode == 40 or event.keycode == 98:
                canvas.yview_scroll(1, "units")

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

        def ScrollEvent_Bound(event):
            canvas.bind_all("<MouseWheel>", ScrollEventV)
            canvas.bind_all("<Shift-MouseWheel>", ScrollEventH)
            canvas.bind_all("<KeyPress>", ScrollEventKey)
        def ScrollEvent_UnBound(event):
            canvas.unbind_all("<MouseWheel>")
            canvas.unbind_all("<Shift-MouseWheel>")
            canvas.unbind_all("<KeyPress>")

        canvas.bind("<Enter>", ScrollEvent_Bound)
        canvas.bind("<Leave>", ScrollEvent_UnBound)
...