小编典典

如何在Tkinter中使用滚动条创建LabelFrame?

python

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

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

freq_frame示例

问题在于标签和条目对的数量不尽相同,并且屏幕上可能不止这些。我需要一种方法来为此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)

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

另外,这个问题似乎有点薄,但是我不知道要添加什么。请随时询问更多信息(但要具体说明)。

谢谢!


阅读 220

收藏
2021-01-20

共1个答案

小编典典

标签框不支持滚动。因此,对您的问题的简短回答是“您不能”。这听起来很明显,但是如果小部件的文档未说它支持滚动,则它不支持滚动。

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

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

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

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

2021-01-20