首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python tkinter可滚动框架

python tkinter可滚动框架
EN

Stack Overflow用户
提问于 2018-10-18 16:06:23
回答 1查看 105关注 0票数 0

我已经用tkinter制作了一个可滚动的框架,但是有一些东西不起作用。

-Is有没有办法让scrollbar更接近labels呢?

-Is有没有办法让scrollbar从顶部开始而不是从中间开始?

-When我使用bind,当我的鼠标在labels上时,我不能滚动,而当我使用bind_all时,我可以在窗口上的任何地方滚动。有没有办法只在我的鼠标在label上方时才滚动

我的代码:

代码语言:javascript
运行
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2018-10-18 16:34:02

对于你的第三个问题,你可以简单地检查事件是否在你的scroll_canvas之前的帧内。

代码语言:javascript
运行
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52869572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档