有没有办法给出事件参数?

Is there a way to give an event argument?

我正在尝试制作滚动框class,但事件对我来说仍然是新事物。

所以,我的框架很好,但是当我尝试创建鼠标滚轮事件时,我收到一个错误,我错过了 "event" 参数。我明白这一点,但我不明白我需要在那里放置什么类型的论点。

从 Google 搜索中,我得到了一些答案,但代码没有放在 class 中,当我尝试将它放在我的 class 中时,我收到错误提示我忘了给出事件参数。

我在某处读到,如果我用 lambda 设置它,那么它会修复错误,但我收到另一个错误,告诉我 lambda 不接受任何参数,但有一个给出...

我不要求解决问题,如果我得到一部关于这些事件如何运作的纪录片,那将非常有帮助。或者也许有人可以向我解释如何在 classes 中处理它,因为我找到了一些有关事件如何工作的信息,但只是一般信息。

我的测试代码在这里:

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 // OS: Window (7)

我正在玩在 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)