使用tkinter pack()方法,自动隐藏滚动条未按预期显示

时间:2019-07-14 20:09:41

标签: python macos user-interface tkinter

我正在使用tkinter为我的Python应用程序构建GUI,并且我希望该应用程序具有一个滚动条,该滚动条在需要时隐藏并显示,以使窗口不必总是全尺寸。我主要先在MacOS和Windows上对代码进行编程(因为当我在MacOS上可以使用某些东西时,使其在Windows上很容易)。

默认情况下,tkinter中的滚动条在不需要时不会自动隐藏自身,但是我发现了一些应该执行此操作的代码in this stackoverflow question。然后,我制作了一个测试文件,以便可以在不影响我的较大项目的情况下随意修改代码。我从stackoverflow中提取的代码不是我所需要的,因此我在测试文件中对其进行了编辑。测试文件中的代码当前如下所示:

import tkinter as tk


class AutoScrollbar(tk.Scrollbar):
    """Create a scrollbar that hides iteself if it's not needed. Only
    works if you use the pack geometry manager from tkinter.
    """
    def set(self, lo, hi):
        if float(lo) <= 0.0 and float(hi) >= 1.0:
            self.pack_forget()
        else:
            if self.cget("orient") == tk.HORIZONTAL:
                self.pack(fill=tk.X, side=tk.BOTTOM)
            else:
                self.pack(fill=tk.Y, side=tk.RIGHT)
        tk.Scrollbar.set(self, lo, hi)
    def grid(self, **kw):
        raise tk.TclError("cannot use grid with this widget")
    def place(self, **kw):
        raise tk.TclError("cannot use place with this widget")


#Creating the root, canvas, and autoscrollbar
root = tk.Tk()
vscrollbar = AutoScrollbar(root)
canvas = tk.Canvas(root, yscrollcommand=vscrollbar.set)
canvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
vscrollbar.config(command=canvas.yview)

#Creating the frame its contents
frame = tk.Frame(canvas)
label = tk.Label(frame, text="text", font=("Arial", "512"))
label.pack()

#Stuff that I don't quite understand
canvas.create_window(0, 0, anchor=tk.NW, window=frame)
frame.update_idletasks()
canvas.config(scrollregion=canvas.bbox("all"))

root.mainloop()

但是,每当我运行该程序时,滚动条都不会像我想要的那样显示在屏幕的最右侧。相反,它显示在右下角,并且似乎在应用程序容器的底部延伸了一个白色块。此外,白色块似乎算作框架内容的一部分,这会使滚动条提早显示。

足够大的窗口,没有滚动条 https://i.stack.imgur.com/kZGfa.png

带有滚动条的窗口较小 https://i.stack.imgur.com/BJhcm.png

当我将代码添加到应用程序中时,问题甚至更加严重。该应用程序容器的大小保持不变,但是所有内容都被压缩到左上角的一个小得多的框中,当我装入新的小部件时,该框会扩展。

自动滚动实施之前的应用主屏幕 https://i.stack.imgur.com/LfWQo.png

自动滚动实施后的应用主屏幕 https://i.stack.imgur.com/ozmzi.png

自动滚动实施后扩展了应用主屏幕 https://i.stack.imgur.com/PCuUt.png

我已经摆弄好几天了。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

从您发布的示例来看,问题出在您如何pack画布上。

更改:

canvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

收件人:

canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)