【问题标题】:tkinter Scrollbar collapses the Canvas it's intkinter Scrollbar 折叠它所在的 Canvas
【发布时间】:2019-06-08 22:50:34
【问题描述】:

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

除了左侧部分将垂直滚动之外,以下是它的外观的一般概念。

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

下面是代码。

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()

我确定我错过了一个简单的概念,但我就是想不通。

【问题讨论】:

    标签: python python-3.x user-interface tkinter tk


    【解决方案1】:

    发生这种情况的原因是pack 几何管理器的工作方式。看看这个answer。在此引用:

    默认情况下pack 将尝试缩小(或扩大)容器以完全适合其子项。因为滚动条是画布的子级,画布会缩小以适应

    要解决这个问题,您可以使用额外的Frame 来包含CanvasScrollbar,并将滚动条的父级设置为此框架。

    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()

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 2014-01-22
      • 2022-08-19
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多