簡體   English   中英

python tkinter可滾動框架

[英]python tkinter scrollable frame

我在tkinter制作了一個可滾動的框架,但是有些事情不起作用。

-是否可以將scrollbar拉近labels

-是否有辦法在頂部而不是在中間啟動scrollbar

-當我使用bind時,當鼠標懸停在labels上方時,我無法滾動;當我使用bind_all我可以在窗口中的任何位置滾動。 只有當鼠標在label上方時,才可以滾動嗎?

我的代碼:

from tkinter import *

class Example:
    def __init__(self, root):
        self.master = root
        self.init_scrollframe()

    def init_scrollframe(self):
        self.big_frame = Frame(self.master)
        self.big_frame.grid(row=0, column=0)
        self.title = Label(self.big_frame, text="TITLE", font=("Arial", 30))
        self.title.grid(row=0, column=0, columnspan=2)
        self.frame = Frame(self.big_frame)
        self.frame.grid(row=1, column=0)
        self.scrollb = Scrollbar(self.frame, orient=VERTICAL)
        self.scrollb.grid(row=0, column=1, sticky=N+S+W)
        self.scroll_canvas = Canvas(self.frame, yscrollcommand=self.scrollb.set)
        self.scroll_canvas.grid(row=0, column=0, sticky=N+S+E)
        self.scrollb.config(command=self.scroll_canvas.yview)
        ##this doesn't work                                                                   
        """self.frame.bind("<MouseWheel>", self._on_mousewheel)                               
        self.frame.bind("<Button-5>", self._on_mousewheel)                                    
        self.frame.bind("<Button-4>", self._on_mousewheel)"""
        ##this works but it is scrolling also when I am not above the labels                  
        self.scroll_canvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.scroll_canvas.bind_all("<Button-5>", self._on_mousewheel)
        self.scroll_canvas.bind_all("<Button-4>", self._on_mousewheel)
        self.my_frame = Frame(self.scroll_canvas)
        ##put some labels into the scrollable frame                                           
        for i in range(100):
            self.lbl = Label(self.my_frame, text=str("label number " + str(i)))
            self.lbl.grid(row=i, column=0)
        self.scroll_canvas.create_window(0, 0, window=self.my_frame)
        self.my_frame.update_idletasks()
        self.scroll_canvas.config(scrollregion=self.scroll_canvas.bbox("all"))

    ##this is for scrolling                                                                   
    def _on_mousewheel(self, event):
        if event.num == 5 or event.delta == -120:
            self.scroll_canvas.yview_scroll(1, "units")
        if event.num == 4 or event.delta == 120:
            self.scroll_canvas.yview_scroll(-1, "units")

if __name__ == "__main__":
    root = Tk()
    ex = Example(root)
    root.mainloop()

對於第三個問題,您可以簡單地檢查事件是否在scroll_canvas之前的scroll_canvas

from tkinter import *

class Example:
    def __init__(self, root):
        self.master = root
        self.init_scrollframe()

    def init_scrollframe(self):
        self.big_frame = Frame(self.master)
        self.big_frame.grid(row=0, column=0)
        self.title = Label(self.big_frame, text="TITLE", font=("Arial", 30))
        self.title.grid(row=0, column=0, columnspan=2)
        self.frame = Frame(self.big_frame,name="test") #give it a name to check
        self.frame.grid(row=1, column=0)
        self.scrollb = Scrollbar(self.frame, orient=VERTICAL)
        self.scrollb.grid(row=0, column=1, sticky=N+S+W)
        self.scroll_canvas = Canvas(self.frame, yscrollcommand=self.scrollb.set)
        self.scroll_canvas.grid(row=0, column=0, sticky=N+S+E)
        self.scrollb.config(command=self.scroll_canvas.yview)
        self.scroll_canvas.bind_all("<MouseWheel>", self._on_mousewheel)
        self.scroll_canvas.bind_all("<Button-5>", self._on_mousewheel)
        self.scroll_canvas.bind_all("<Button-4>", self._on_mousewheel)
        self.my_frame = Frame(self.scroll_canvas)
        for i in range(100):
            self.lbl = Label(self.my_frame, text=str("label number " + str(i)))
            self.lbl.grid(row=i, column=0)
        self.scroll_canvas.create_window(0, 0, window=self.my_frame)
        self.my_frame.update_idletasks()
        self.scroll_canvas.config(scrollregion=self.scroll_canvas.bbox("all"))

    def _on_mousewheel(self, event):
        caller = event.widget
        if "test" in str(caller): #check if event is within frame
            if event.num == 5 or event.delta == -120:
                self.scroll_canvas.yview_scroll(1, "units")
            if event.num == 4 or event.delta == 120:
                self.scroll_canvas.yview_scroll(-1, "units")

if __name__ == "__main__":
    root = Tk()
    ex = Example(root)
    root.mainloop()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM