【发布时间】: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