如何使Tkinter列表框适合内容

时间:2013-03-29 14:55:45

标签: python listbox tkinter

我正在编写一个程序来运行各种服务器的批处理文件,到目前为止一切正常。我的意思是程序工作并使用简单的GUI,一切都很好。除了在列表框中显示稍长的名称时,它会剪掉结束。 Tkinter使用的代码如下。

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

keys = serverDict.keys()
for key in sorted(keys):
    listbox.insert(tk.END, key)

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

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

所以基本上它一切都运行得很好,我没有得到任何错误,但它有点烦人的方式它不适合,我不能滚动。我知道我可以添加滚动条并使窗口重新调整大小并使列表框适合它给出的空间,但我希望它能够工作而不必调整大小。我知道这并不重要,但这只是我喜欢工作的一件事,但却无法理解:/。

enter image description here

4 个答案:

答案 0 :(得分:9)

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

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

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

root.winfo_toplevel().wm_geometry("")

答案 1 :(得分:3)

这是基于Oblivion的答案,但我编辑了它,因此它对我有用。

我创建了一个基于原始列表框的新列表框类,但是我从Oblivion的代码中获得了一个新函数。然后我调用该函数,它使列表框的大小合适。

class Listbox(tk.Listbox):
    def autowidth(self,maxwidth):
        f = font.Font(font=self.cget("font"))
        pixels = 0
        for item in self.get(0, "end"):
            pixels = max(pixels, f.measure(item))
        # bump listbox size until all entries fit
        pixels = pixels + 10
        width = int(self.cget("width"))
        for w in range(0, maxwidth+1, 5):
            if self.winfo_reqwidth() >= pixels:
                break
            self.config(width=width+w)

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

keys = serverDict.keys()
for key in sorted(keys):
    listbox.insert(tk.END, key)

button = tk.Button(master, text="Execute", command=execute)
listbox.autowidth(250)
listbox.pack()
button.pack()
tk.mainloop()

答案 2 :(得分:2)

tkListAutoWidth.py显示了一种方法:

http://svn.effbot.org/public/stuff/sandbox/tkinter/

编辑:

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

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

答案 3 :(得分:1)

只需给出宽度和高度0,如下所示

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