2013-03-29 14 views
4

我正在編寫一個程序來運行各種服務器的批處理文件,到目前爲止一切都很順利。我的意思是這些程序運行並使用簡單的GUI,一切都很好。除了當我給它一個稍長的名字以顯示在列表框中時,它將剪輯結束。 Tkinter使用的代碼如下。如何適應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

+0

您是否嘗試根據具有最大字符數的列表項來縮放寬度(以像素爲單位)? (這可能不起作用,因爲字符!=像素數量,但它可能讓你想到一個更好的解決方案。) – gary

+0

那麼我怎麼才能算出字符串中的像素數?如果我沒有弄錯,是否有與字體有關的度量函數呢?然後'如果tk.measure(string)> largestString:largestString = tk.measure(string)'或者類似的東西。 – frasertmay

回答

3

這是基於Oblivi在答案上,但我編輯它,所以它爲我工作。

我做了一個新的listbox類,它基於原始的,但是有一個我從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

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

所以,我不太清楚如何使用它,我必須導入它或什麼?它也使用'Tkinter'而不是'tkinter',所以它不是爲我正在使用的Python(3.3.0)版本編寫的。 – frasertmay

+0

將類直接放入代碼中可能最容易。有一兩個小小的變化,它應該在python 3.3上很好。看到我上面的編輯。 – Oblivion

+0

所以我可以堅持這個在我的代碼,它應該工作(當然有變化),或者我仍然需要該.py文件。其實我只是意識到你發給我的文件只是一個示例文件,而不是我必須安裝的東西或任何東西。 非常感謝! – frasertmay

4

重置列表框寬度爲我工作。我使用了遺忘的答案,並注意到只有寬度總是爲零。

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

我也建議重新加載列表內容後重置根窗口幾何。如果用戶手動擴展窗口,窗口將停止適應其內容的大小。

root.winfo_toplevel().wm_geometry("") 
+0

好而短。爲我完美工作。 – ArtOfWarfare

+0

爲我工作,出色。 – Sovtek