6

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

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

剪辑列表框示例

4

3 回答 3

10

重置列表框宽度对我有用。我使用了遗忘的答案,并注意到宽度始终为零。

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

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

root.winfo_toplevel().wm_geometry("")
于 2014-10-22T09:21:29.260 回答
4

只需给出宽度和高度 0 如下

listbox.config(width=0,height=0)
于 2018-04-12T07:01:31.450 回答
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()
于 2013-03-29T22:03:55.190 回答