使用我写的下面的示例代码我遇到了一些行为问题。 我想根据需要添加/删除滚动条。但是当我这样做时,当窗口调整大小时,它会移动窗口中的所有其他元素。这只是一个演示问题的示例,当添加和删除滚动条时,您将看到窗口调整大小。在实际应用程序中,窗口上有更多小部件。
我是否尝试以正确的方式执行此操作,或者如果不能解决此问题?我还计划在另一个单独的框架中创建带滚动条的第二个小部件。
from tkinter import *
from tkinter import ttk
class TopFrame(ttk.Frame):
def __init__(self, parent, col=0, row=0):
ttk.Frame.__init__(self, parent)
self.innerframe = ttk.Frame(parent)
self.list_scroll = ttk.Scrollbar(self.innerframe)
self.list_scroll.grid(column=1, row=0, sticky=NS)
self.list_scroll.grid_remove()
self.list = Listbox(self.innerframe, width=64, height=8,
yscrollcommand=self.list_scroll.set)
self.list_scroll.config(command=self.list.yview)
self.list.grid(column=0, row=0, sticky=NSEW)
self.innerframe.grid(column=col, row=row)
self.addbtn = ttk.Button(parent, text='add item',
command=self.additem)
self.addbtn.grid(column=col, row=row+1, padx=10, pady=2)
self.delbtn = ttk.Button(parent, text='del item',
command=self.delitem)
self.delbtn.grid(column=col, row=row+2, padx=10, pady=2)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
def additem(self):
count = str(len(self.list.get(0, END)))
self.list.insert(END, 'demo' + count)
if len(self.list.get(0, END)) > 8:
self.list_scroll.grid()
def delitem(self):
self.list.delete(END)
if len(self.list.get(0, END)) <= 8:
self.list_scroll.grid_remove()
class MasterFrame(Tk):
def __init__(self):
Tk.__init__(self)
topframe = TopFrame(self)
if __name__ == '__main__':
MasterFrame().mainloop()
答案 0 :(得分:0)
首次显示窗口后,您可以获取窗口大小,然后使用该窗口调用根窗口上的geometry
方法。使用geometry
命令设置窗口大小时,它将根据对其内部窗口小部件的更改停止调整大小。
最简单的方法是编写一个函数来执行此操作,并安排它与after_idle
一起运行,该函数应在首次显示窗口后触发。