Я пытаюсь создать класс рамки прокрутки, но события все еще являются новыми вещами для меня.
Итак, моя структура в порядке, но когда я пытаюсь создать событие из колесо мыши я получаю ошибку, которую я пропустил, чтобы дать аргумент "событие". Я понимаю это, но я не понимаю, какой тип аргумента мне нужно разместить.
Из поисков 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)