【问题标题】:Auto-hiding scrollbar not showing as expected with tkinter pack() method使用 tkinter pack() 方法未按预期显示自动隐藏滚动条
【发布时间】:2019-11-23 15:03:11
【问题描述】:

我正在使用 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()

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

足够大的窗口,没有滚动条

带有滚动条的稍微小一点的窗口

当我将代码添加到我的应用程序时,问题更加严重。应用程序容器的大小保持不变,但内容全部压缩到左上角的一个小得多的盒子中,当我装入新的小部件时它会展开。

自动滚动实施前的应用主屏幕

自动滚动实施后的应用主屏幕

自动滚动实施后扩展的应用主屏幕

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

【问题讨论】:

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

标签: python macos user-interface tkinter


【解决方案1】:

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

变化:

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

收件人:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多