tkinter:滚动条自动隐藏,不调整窗口大小

时间:2016-02-13 18:41:33

标签: python user-interface tkinter python-3.5

使用我写的下面的示例代码我遇到了一些行为问题。 我想根据需要添加/删除滚动条。但是当我这样做时,当窗口调整大小时,它会移动窗口中的所有其他元素。这只是一个演示问题的示例,当添加和删除滚动条时,您将看到窗口调整大小。在实际应用程序中,窗口上有更多小部件。

我是否尝试以正确的方式执行此操作,或者如果不能解决此问题?我还计划在另一个单独的框架中创建带滚动条的第二个小部件。

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()

1 个答案:

答案 0 :(得分:0)

首次显示窗口后,您可以获取窗口大小,然后使用该窗口调用根窗口上的geometry方法。使用geometry命令设置窗口大小时,它将根据对其内部窗口小部件的更改停止调整大小。

最简单的方法是编写一个函数来执行此操作,并安排它与after_idle一起运行,该函数应在首次显示窗口后触发。