在下面的代码中(复制并粘贴到文本文件中,您应该可以立即运行它),文本将输入到Entry小部件中,然后显示在多列列表框中。列表框的列将展开以适合文本,但包含的窗口/框架不会展开以适合展开的列表框。
尝试输入一个短字符串,“test”,然后输入一个很长的字符串“qwertyuiopasdf”,看看我的意思。
如何制作以使包含窗口/框架扩展以始终适合内容?我想继续使用网格管理器进行组织。
WIndows 10上的Python 3.5.1 .Tkinter版本8.6。
from tkinter import *
from tkinter import ttk
import tkinter.font as tkFont
class McListBox(ttk.Treeview):
#use a ttk.Treeview as a multicolumn ListBox
def __init__(self, master=None, **kwargs):
headers=kwargs['columns']
id=kwargs['name']
ttk.Treeview.__init__(self, master, name=id, columns=headers, show='headings')
self.headers = headers
self.items = []
self.build_tree()
def build_tree(self):
# set up the columns
for col in self.headers:
self.heading(col, text=col.title())
# adjust the column's width to the header string
self.column(col, width=tkFont.Font().measure(col.title()))
# in case items are added already
for item in self.items:
self.insert('', 'end', values=item)
# adjust column's width if necessary to fit each value
for ix, val in enumerate(item):
col_w = tkFont.Font().measure(val)
if self.column(self.headers[ix],width=None)<col_w:
self.column(self.headers[ix], width=col_w)
def add(self, text):
# add the text in the first column and a 1 in the second
item = (text, 1)
self.insert('', 'end', values=item)
# adjust column's width if necessary to fit each value
for ix, val in enumerate(item):
col_w = tkFont.Font().measure(val)
if self.column(self.headers[ix],width=None)<col_w:
self.column(self.headers[ix], width=col_w)
class Application(ttk.Frame):
def __init__(self, master=None):
ttk.Frame.__init__(self, master)
self.master.rowconfigure(0, weight=1)
self.master.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.columnconfigure(1, weight=1)
self.grid(row=0,column=0,sticky='nsew')
self.createWidgets()
def createWidgets(self):
# this is the multi column list box
varDisplayArea = McListBox(self, name='varDisplayArea', columns=['var', 'val'])
varDisplayArea.grid(column=0, row=0, sticky='nsew')
# this is the input to go into the multicolum list box
inputBox = ttk.Entry(self, name='inputBox')
inputBox.grid(column=0, row=1, sticky=W)
inputBox.focus()
self.master.bind('<Return>', self.addEntry)
def addEntry(self, *args):
# the value in the entry widget is added to the list box
inputBox = self.children['inputBox']
varDisplayArea = self.children['varDisplayArea']
input = inputBox.get()
inputBox.delete(0, END)
varDisplayArea.add(input)
inputBox.focus()
app = Application()
app.master.title('sample app')
app.mainloop()