python - Python Tkinter 滚动条在使用滚动条时向上而不是向下平移也会出现对齐问题
问题描述
我正在使用 TKinter 为我的 python 应用程序构建一个 GUI。
我想在主屏幕上添加一个滚动条,因为我有很多数据要显示但空间非常小。目前我使用以下线路:
root=Tk()
root.state("zoomed")
#...rest of the code... (Relevant parts mentioned below:)
root.mainloop()
最大限度地利用可用的屏幕空间,但即便如此,对我来说也没有削减它。
这是我用来添加滚动条的 John Elder(Codemy.com 的 CEO)的代码:
# Create A Main Frame
main_frame = Frame(root)
main_frame.pack(fill=BOTH, expand=1)
# Create A Canvas
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
# Add A Scrollbar To The Canvas
my_scrollbar = ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
# Configure The Canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))
def _on_mouse_wheel(event):
my_canvas.yview_scroll(-1 * int((event.delta / 100)), "units")
my_canvas.bind_all("<MouseWheel>", _on_mouse_wheel)
# Create ANOTHER Frame INSIDE the Canvas
encompasser = Frame(my_canvas, bg=mainbg)
# Add that New frame To a Window In The Canvas
my_canvas.create_window((0,0), window=encompasser, anchor="n")
#Adding the scroll bar part ends here...
encompasser=Frame(my_canvas,bg=mainbg, borderwidth=0)
encompasser.pack(fill=BOTH, expand=1)
#second_frame = LabelFrame(my_canvas, borderwidth=0, bg=mainbg).pack()
header=LabelFrame(encompasser,bg=mainbg, borderwidth=0)
header.pack()
greet=Label(header,font="Arial 20",text="Prescription Generator V4.0.0", bg=mainbg, fg="black").pack(pady=10)
utilitiesF=LabelFrame(header,bg=mainbg, borderwidth=0)
utilitiesF.pack()
settingLF=LabelFrame(utilitiesF,bg=mainbg, borderwidth=0)
megaF=LabelFrame(encompasser,bg=mainbg, borderwidth=0)
megaF.pack()
dateF=LabelFrame(utilitiesF, padx=10, pady=10, bg=mainbg, borderwidth=0)
dateF.grid(row=0, column=1)
date=Label(dateF,font="Arial 14",text="Date:", bg=mainbg).grid(row=0,column=0, sticky=E)
edate=Entry(dateF, width=9,borderwidth=0, font="Arial 14")
edate.insert(0,today)
edate.grid(row=0, column=1, padx=5)
my_tree_frame=LabelFrame(header, padx=10, pady=10, bg=subbg, borderwidth=0)
my_tree_frame.pack()
将滚动条添加到画布并在框架中打开画布后,我将内容添加到名为“encompasser”的框架中。
问题:当我单击按钮时:显示数据库,打开以下树视图: 树视图打开,将我的项目的其余部分向下移动
当我的项目的其余部分向下移动时,滚动条不会向下滚动。 滚动条卡住了,无法向上或向下移动 我在这里做错了什么?我知道一种解决方案是将树视图小部件作为 Toplevel() 打开,但我希望它在同一页面中打开。请回答我的问题,谢谢!
还有一件事:当我尝试打包包含我所有小部件的框架时,整个对齐方式都搞砸了。整个项目向左侧移动,从美学上看并不好看。
解决方案
首先,您使用相同的变量名创建了另一个框架encompasser
:
encompasser=Frame(my_canvas,bg=mainbg, borderwidth=0)
encompasser.pack(fill=BOTH, expand=1)
上面两行应该被删除。
其次,您应该在调整scrollregion
内部框架encompasser
大小时更新 ,而不是my_canvas
.
删除行:
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion = my_canvas.bbox("all")))
并在创建后添加以下行encompasser
:
encompasser.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
推荐阅读
- java - 从Java中的字符串获取子字符串
- c# - 是否可以让方法始终返回与调用实例相同类型的值?
- css - Emotion JS:悬停父级时如何将样式应用于子级?
- neo4j - 在相册中查找多张照片
- php - 为什么 Doctrine Cache 不保存原始 php 数组?
- javascript - 如何将具有切换功能的状态组件转换为 reactjs 中的无状态组件?
- couchdb - CouchDB _all_dbs 401 未经授权的“解决方案”
- python - 无效类型:字符串“test@example.com”,应为第 1 行第 30 列的序列
- ffmpeg - 从 jpgs 目录创建延时摄影
- python - 计算其他函数执行时间的函数