【问题标题】:How to fit Tkinter listbox to contents如何使 Tkinter 列表框适合内容
【发布时间】:2013-03-20 07:15:07
【问题描述】:

我正在使用下面的代码将字符串添加到列表框。当我运行代码并打开窗口时,由于窗口不够大,较长的字符串会被剪掉(见屏幕截图)。我曾尝试使窗口可调整大小并添加滚动条,但我想知道是否有办法自动调整大小以适应内容。

master = tk.Tk()
listbox = tk.Listbox(master, selectmode=tk.SINGLE)

games = ["Garry's Mod", "Mount and Blade: Warband", "Tekkit"]
for game in sorted(games):
    listbox.insert(tk.END, game)

button = tk.Button(master, text="Execute", command=execute)

listbox.pack()
button.pack()
tk.mainloop()

【问题讨论】:

  • 您是否尝试过根据具有最大字符数的列表项缩放宽度(以像素为单位)? (这可能不起作用,因为字符!= 像素数,但它可能会让您想到更好的解决方案。)

标签: python listbox tkinter


【解决方案1】:

重置列表框宽度对我有用。我使用了 Oblivion 的答案,发现宽度始终为零。

listbox = tk.Listbox(master, selectmode=tk.SINGLE)
listbox.config(width=0)

我还建议在重新加载列表内容后重置根窗口几何图形。否则,如果用户手动扩展窗口,窗口将停止适应其内容的大小。

root.winfo_toplevel().wm_geometry("")

【讨论】:

    【解决方案2】:

    只给宽度和高度0如下

    listbox.config(width=0,height=0)
    

    【讨论】:

    • 谢谢!您的解决方案比其他所有解决方案都好得多。
    【解决方案3】:

    tkListAutoWidth.py 展示了一种方法。

    编辑:

    所以你可能有类似的东西,

    import tkinter as tk
    from tkinter import font
    
    
    class NewListbox(tk.Listbox):
    
        def autowidth(self, maxwidth=100)
            autowidth(self, maxwidth)
    
    
    def autowidth(list, maxwidth=100):
        f = font.Font(font=list.cget("font"))
        pixels = 0
        for item in list.get(0, "end"):
            pixels = max(pixels, f.measure(item))
        # bump listbox size until all entries fit
        pixels = pixels + 10
        width = int(list.cget("width"))
        for w in range(0, maxwidth+1, 5):
            if list.winfo_reqwidth() >= pixels:
                break
            list.config(width=width+w)
    
    
    if __name__ == "__main__":
    
        master = tk.Tk()
        listbox = NewListbox(master, selectmode=tk.SINGLE)
    
        # ...
        # ...
        keys = serverDict.keys()
        for key in sorted(keys):
            listbox.insert("end", key)
    
        listbox.pack()
    
        button = tk.Button(master, text="Execute", command=execute)
        button.pack()
    
        listbox.autowidth()
    
        master.mainloop()
    

    【讨论】:

    • 将类直接放入代码中可能是最简单的方法。进行一两个小的更改,在 python 3.3 上应该没问题。见我上面的编辑。
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2020-07-25
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多