Python 如何使Tkinter列表框适合内容

Python 如何使Tkinter列表框适合内容,python,listbox,tkinter,Python,Listbox,Tkinter,我正在使用下面的代码向列表框添加字符串。当我运行代码并打开窗口时,由于窗口不够大,较长的字符串会被剪裁(参见屏幕截图)。我尝试过调整窗口大小并添加滚动条,但我想知道是否有办法自动调整大小以适应内容 master=tk.tk() listbox=tk.listbox(master,selectmode=tk.SINGLE) 游戏=[“加里的Mod”,“坐骑和刀锋:战乐队”,“Tekkit”] 对于排序中的游戏(游戏): listbox.insert(tk.END,游戏) 按钮=tk.button(

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

master=tk.tk()
listbox=tk.listbox(master,selectmode=tk.SINGLE)
游戏=[“加里的Mod”,“坐骑和刀锋:战乐队”,“Tekkit”]
对于排序中的游戏(游戏):
listbox.insert(tk.END,游戏)
按钮=tk.button(master,text=“Execute”,command=Execute)
listbox.pack()
button.pack()
tk.mainloop()
显示了一种方法

编辑:

所以你可能有一些类似于

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

重置列表框宽度对我来说很有效。我使用了遗忘的答案,注意到宽度总是零

listbox = tk.Listbox(master, selectmode=tk.SINGLE)
listbox.config(width=0)
我还建议在重新加载列表内容后重置根窗口几何图形。否则,如果用户手动扩展窗口,窗口将停止调整其内容的大小

root.winfo_toplevel().wm_geometry("")

只需在下面给出宽度和高度0

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

您是否尝试过根据具有最大字符数的列表项缩放宽度(以像素为单位)?(这可能不起作用,因为字符数!=像素数,但它可能会让您想到更好的解决方案。)将该类直接放入代码中可能是最容易的。在Python3.3上,只要做一两个小改动,就可以了。看到我的编辑上面。谢谢!你的解决方案比其他的都好。