Tkinter滚动条导致其所在的画布折叠

2024-06-17 09:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是一个大致的想法,它看起来像除了左边的部分将垂直滚动。你知道吗

enter image description here

不幸的是,当我打包滚动条的左侧部分完全消失。你知道吗

enter image description here

下面是代码。你知道吗

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

我肯定我错过了一个简单的概念,但我就是想不出来。你知道吗


Tags: selfnone列表ifinitconfigurewindowframe
1条回答
网友
1楼 · 发布于 2024-06-17 09:33:54

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

By default pack will attempt to shrink (or grow) a container to exactly fit its children. Because the scrollbar is a children of the canvas in the, the canvas shrinks to fit.

为了解决这个问题,您可以使用一个额外的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()

Result

相关问题 更多 >