我正在使用Python和Tkinter为我正在编写的程序创建GUI,我遇到了一些问题。
我有一个来自LabelFrame的三个对象来自一个来自Frame的对象。 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)
如果有人可以帮助解决这些问题,我会很感激。
此外,这个问题看起来可能有点薄,但我不知道要添加什么。不要犹豫,要求提供更多信息(但具体而言)。
谢谢!
答案 0 :(得分:3)
Labelframes不支持滚动。所以对你的问题的简短回答是“你不能”。这听起来很明显,但如果窗口小部件的文档没有说它支持滚动,则它不支持滚动。
然而,有一个简单的解决方案。首先,将画布作为子画面添加到labelframe并打包,以便填充labelframe。将滚动条附加到画布并将它们添加到labelframe。然后在画布中嵌入一个框架,将您的窗口小部件添加到该内部框架,然后在添加所有内部标签和条目后调整画布的滚动区域以匹配框架的大小。
这听起来很复杂,但它确实很直接。
至于在调用load_message
时重新创建小部件,调用grid_forget
只会将它们从视图中删除,它实际上并不会破坏小部件。随着时间的推移,你可能最终得到数百个不可见的小部件,这几乎肯定不是你想要的。
相反,您希望首先销毁所有现有的小部件。如果他们都在同一个父母身边,这很容易,因为你可以向父母询问所有孩子的清单。只需遍历该列表即可删除每个子项,然后添加任何新子项。更简单的解决方案是销毁并重新创建包含标签和条目的内部框架。删除窗口小部件时,所有子窗口小部件都会自动销毁。因此,删除该内部框架,创建一个新框架,然后再次添加标签和条目。