繁体   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