【问题标题】:How do you create a LabelFrame with a scrollbar in Tkinter?如何在 Tkinter 中创建带有滚动条的 LabelFrame?
【发布时间】:2011-08-18 20:46:05
【问题描述】:

我正在使用 Python 和 Tkinter 为我正在编写的程序创建 GUI,但遇到了几个问题。

我在一个从 Frame 继承的对象中有三个从 LabelFrame 继承的对象。 LabelFrame 后代之一是两列对应的 Label 和 Entry 对象。

问题在于标签和条目对的数量不等,而且屏幕上的大小可能会超出范围。我需要一种为此 LabelFrame 制作滚动条的方法,以便所有内容都适合屏幕。我尝试了各种制作 Scrollbar 对象的方法,但似乎没有任何效果。如何将滚动条绑定到此框架?

此外,当调用 load_message() 方法时,我需要能够刷新或重新加载此 LabelFrame,但它只是在旧对的顶部重新显示新的对(所以当新集合中的对较少时,旧的集合在底部仍然可见)。我试过使用grid_forget(),但要么没有任何变化,要么整个框架都没有显示。我怎样才能忘记这个显示然后重新显示呢?

这是这个类的代码:

class freq_frame(LabelFrame):
    def __init__(self, master = None, text = 'Substitutions'):
        LabelFrame.__init__(self, master, text = text)
        self.grid()
    def load_message(self):
        self.frequency = get_freq(message)
        self.create_widgets()
    def create_widgets(self):
        self.label_list = [Label(self, text = get_label(char, self.frequency[char]), justify = LEFT) for char in self.frequency.keys()]
        self.entry_list = [Entry(self, width = 1) for char in self.frequency.keys()]
        for n in range(len(self.label_list)):
            self.label_list[n].grid(column = 0, row = n)
        for n in range(len(self.entry_list)):
            self.entry_list[n].grid(column = 1, row = n)

如果有人能帮助解决这些问题,我将不胜感激。

另外,这个问题似乎有点薄,但我不知道该补充什么。不要犹豫,询问更多信息(但要具体)。

谢谢!

【问题讨论】:

    标签: python scrollbar tkinter


    【解决方案1】:

    标签框不支持滚动。所以你的问题的简短回答是“你不能”。这听起来很明显,但是如果一个小部件的文档没有说它支持滚动,它就不支持滚动。

    但是,有一个简单的解决方案。首先,将画布作为子项添加到 labelframe 并将其打包以填充 labelframe。将滚动条附加到画布并将它们也添加到标签框。然后在画布中嵌入一个框架,将小部件添加到该内部框架,然后在添加所有内部标签和条目后调整画布的滚动区域以匹配框架的大小。

    这听起来很复杂,但实际上非常简单。

    至于在调用load_message 时重新创建小部件,调用grid_forget 只会将它们从视图中删除,实际上并不会破坏小部件。随着时间的推移,您最终可能会得到数百个不可见的小部件,这几乎肯定不是您想要的。

    相反,您想首先销毁所有现有的小部件。如果它们都在同一个父级中,这很容易,因为您可以向父级询问其所有子级的列表。只需遍历该列表以删除每个孩子,然后添加任何新孩子。一个更简单的解决方案是销毁并重新创建包含标签和条目的内部框架。当您删除一个小部件时,所有子小部件都会自动销毁。因此,删除该内部框架,创建一个新框架,然后再次添加您的标签和条目。

    【讨论】:

    • RE - “听起来很复杂”:Here is some example code 展示了如何滚动包含一堆 Label 对象的 Frame。我成功地使用了这个例子。示例代码使用pack,但我更喜欢grid,因此我成功修改代码以使用网格。
    • RE - "straight-forward":我发现如果您完全了解以下所有内容,此代码才是直截了当的:CanvasScrollBar、Tk 的事件处理、Tk 的'' 事件,Canvas's bbox('all')'all' 参数在经过无数次谷歌搜索并在 Tkinter 上查阅我的教科书后,我无法找到任何文档。关于“all”参数的文档在哪里?)
    • @TrevorBoydSmith:“全部”记录在哪里?查看此页面:effbot.org/tkinterbook/canvas.htm,然后向下滚动到标题为“项目说明符:句柄和标签”的部分。它主要讨论了ALL 常量,但这只是定义为字符串"all",该页面上也提到了。
    • 我查看了官方的 www.tcl.tk 文档,并没有看到任何提及“all”常量的内容。 'all' 常量是否仅适用于 Python 的 tkinter?
    • @TrevorBoydSmith:这不仅仅是 Tkinter 的事情,它是核心 tcl/tk 实现的一部分,并且已经存在了很长时间。在 tcl/tk 文档中,它位于 canvas 手册页上:tcl.tk/man/tcl8.5/TkCmd/canvas.htm#M22
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2010-12-24
    • 2012-04-03
    • 2021-12-02
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多