How to fit Tkinter listbox to contents

2019-08-18 06:09发布

我写一个程序运行于不同的服务器批处理文件,到目前为止,一切都进展良好。 我指的是节目的工作,并使用一个简单的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()

所以基本上它的所有工作完全正常,我没有得到任何错误,但它是一个有点讨厌它无法正确适合的方式,我不能滚动。 我知道我可以添加滚动条,使窗口重新相当大,使列表框适合它给予足够的空间,但我想它,而不必调整的东西工作。 我知道这是不是那么重要,但它只是那种我喜欢工作,但无法弄清楚的一件事情:/。

Answer 1:

重置为我工作列表框的宽度。 我用遗忘的回答,发现宽度始终为零。

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

我还建议重装列表中的内容后,根窗口几何复位。 否则,如果用户手动地延伸的窗口的窗口将停止适应其内容的大小。

root.winfo_toplevel().wm_geometry("")


Answer 2:

这是基于关闭遗忘的答案,但我编辑它,所以它为我工作。

我提出,是基于关闭原来的一个新的列表框类,但有一个新的功能,我从遗忘的代码了。 然后我调用这个函数,它使列表框的适当的大小。

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


Answer 3:

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


Answer 4:

只要给宽度和高度0,如下

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


文章来源: How to fit Tkinter listbox to contents