python - tkinter Scrollbar 折叠它所在的 Canvas
问题描述
我正在尝试制作一个包含两个部分的程序。左侧部分将显示一个可垂直滚动的列表,而右侧部分将根据列表中选择的项目显示信息。忽略正确的部分,因为我还没有到达那里。
下面是它的外观的一般概念,除了左侧部分将垂直滚动。
不幸的是,当我打包滚动条时,左侧部分完全消失了。
下面是代码。
import tkinter as tk
class Tasks(tk.Tk):
def __init__(self, builds=None):
super().__init__()
if builds is None:
self.builds = []
else:
self.builds = builds
self.title('Title')
self.geometry('1000x600')
self.configure(bg='red')
self.tasks_canvas = tk.Canvas(self, width=200, bg='green')
self.tasks_frame = tk.Frame(self.tasks_canvas)
self.scrollbar = tk.Scrollbar(self.tasks_canvas, orient='vertical',command=self.tasks_canvas.yview)
self.canvas_frame = self.tasks_canvas.create_window((0, 0), window=self.tasks_frame, anchor='n')
self.tasks_canvas.configure(yscrollcommand=self.scrollbar.set)
self.tasks_canvas.pack(side=tk.LEFT, fill=tk.Y)
self.scrollbar.pack(side=tk.LEFT, fill=tk.Y, expand=1)
if __name__ == '__main__':
root = Tasks()
root.mainloop()
我确定我错过了一个简单的概念,但我就是想不通。
解决方案
发生这种情况的原因是pack
几何管理器的工作方式。看看这个答案。在这里引用它:
默认情况下
pack
,将尝试缩小(或扩大)容器以完全适合其子项。因为滚动条是 中画布的子级,所以画布会缩小以适应。
为了解决这个问题,您可以使用一个额外的Frame
来包含Canvas
和Scrollbar
并将滚动条的父级设置为此框架。
import tkinter as tk
class Tasks(tk.Tk):
def __init__(self, builds=None):
super().__init__()
self.title('Title')
self.geometry('400x120')
self.configure(bg='red')
self.t_frame = tk.Frame(self)
self.t_frame.pack(side=tk.LEFT)
self.tasks_canvas = tk.Canvas(self.t_frame, width=100, bg='green')
self.scrollbar = tk.Scrollbar(self.t_frame, orient='vertical',command=self.tasks_canvas.yview)
self.tasks_canvas.configure(yscrollcommand=self.scrollbar.set)
self.tasks_canvas.pack(side=tk.LEFT, fill=tk.Y)
self.scrollbar.pack(side=tk.LEFT, fill=tk.Y)
if __name__ == '__main__':
root = Tasks()
root.mainloop()
推荐阅读
- python - 在 Python 中计算移动平均值时出现可逆性错误
- java - CMS 如何决定何时收集 SoftReference?
- epplus - 当文本值中有正斜杠时,EPPlus 读取日期列不正确
- sql - 如何使用 GROUP BY 从 SQL 中的 3 个表中选择数据?
- ios - 反应原生 xcode 项目不在 iphone 上构建
- google-cloud-platform - Google Cloud Composer 变量不会传播到 Airflow
- nsis - 在 NSIS 中跳过参数
- nameerror - Python 3.7 代码不会循环并返回名称错误
- c - 文件搜索场景中的 zlib 压缩问题,zlib 中是否有任何可用的锁定/标志机制允许它们之间的完整性
- python - DRF Viewset 自定义“创建”方法不调用序列化程序自定义“创建”方法