【问题标题】:tkinter: scrollbar autohide without window resizetkinter:滚动条自动隐藏而不调整窗口大小
【发布时间】:2016-05-24 20:33:32
【问题描述】:

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

我是否正在尝试以正确的方式做到这一点,或者如果不是,我该如何解决这个问题?我还计划在另一个单独的框架中添加第二个带有滚动条的小部件。

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

【问题讨论】:

    标签: python user-interface tkinter python-3.5


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-11
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2017-03-12
      • 1970-01-01
      相关资源
      最近更新 更多