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

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

我有三个从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)

如果有人可以帮助您解决上述任何一个问题,我将不胜感激.

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

谢谢!

解决方法:

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

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

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

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

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

上一篇:使用svg让页面自适应浏览器大小,整体等比缩放


下一篇:vue中使用滚动条插件vue-gemini-scrollbar 的demo