python - python tkinter 可滚动框架
问题描述
我已经制作了一个可滚动的框架,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
。
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()
推荐阅读
- sql - 根据类别为药物创建序列号列
- node.js - Firebase - 部署时云功能未运行
- r - 使用 SMOTE 创建 1:1 平衡数据集,而不修改 R 中多数类的观察结果
- amazon-web-services - 如何找出导致我的 EC2 实例无法访问的原因?
- python - 声音分贝输出 Python
- plugins - 分页添加插件
- vue.js - 如何抑制父视图中发生的提取(Vue.js)
- ios - 如何在 Xcode 11.2.1 中构建支持 iOS 7 的 .ipa?
- reactjs - ReactJS、Formik、Bootstrap 模态 - 从模态按钮提交
- ios - 来自 presentView 的 pushViewController