Python tkinter滚动条可折叠画布,并将其';在哪

Python tkinter滚动条可折叠画布,并将其';在哪,python,python-3.x,user-interface,tkinter,tk,Python,Python 3.x,User Interface,Tkinter,Tk,我正在尝试制作一个包含两个部分的程序。左侧部分将显示一个可垂直滚动的列表,而右侧部分将显示基于列表中所选项目的信息。忽略正确的部分,因为我还没有到达那里 下面是它的大致外观,除了左侧部分将垂直滚动 不幸的是,当我打包滚动条时,左边的部分完全消失了 下面是代码 import tkinter as tk class Tasks(tk.Tk): def __init__(self, builds=None): super().__init__() if

我正在尝试制作一个包含两个部分的程序。左侧部分将显示一个可垂直滚动的列表,而右侧部分将显示基于列表中所选项目的信息。忽略正确的部分,因为我还没有到达那里

下面是它的大致外观,除了左侧部分将垂直滚动

不幸的是,当我打包滚动条时,左边的部分完全消失了

下面是代码

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
将尝试缩小(或扩大)容器以完全适合其子容器。由于滚动条是中画布的子项,画布会收缩以适应

要解决这个问题,您可以使用一个额外的
框架
来包含
画布
滚动条
,并将滚动条的父级设置为该框架

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()
将tkinter作为tk导入
课堂任务(tk.tk):
def uuu init uuu(self,builds=None):
super()。\uuuu init\uuuuu()
self.title(“title”)
自几何体('400x120')
自我配置(bg='red')
self.t_frame=tk.frame(self)
自组装框架组件(侧面=左侧)
self.tasks\u canvas=tk.canvas(self.t\u框架,宽度=100,背景为绿色)
self.scrollbar=tk.scrollbar(self.t\u frame,orient='vertical',command=self.tasks\u canvas.yview)
self.tasks\u canvas.configure(yscrollcommand=self.scrollbar.set)
self.tasks\u canvas.pack(side=tk.LEFT,fill=tk.Y)
self.scrollbar.pack(side=tk.LEFT,fill=tk.Y)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tasks()
root.mainloop()