我希望在Tkinter中创建一个类似于表的东西,但它不一定必须是一个。
我想创建标题'Name1','Name2','Value'作为示例,并且在每个标题下面我希望有几个空白行。
这些行我希望稍后填写(因此是一个Label),其中包含我已计算的值或名称的字符串值。
对于'Name2',我实际上希望整个列都是一个下拉菜单。我已经为它创建了一个代码,但我不确定如何将它合并到这个'table'中。
例如,是否可以在Label小部件周围创建边框,使其看起来像'table'?
非常感谢在这种情况下可能出现的任何指示。如果您需要我的任何代码来进行某些操作,请询问。谢谢!
答案 0 :(得分:34)
你有什么问题?简单的解决方案是使用grid
布置小部件。您可以在每个单元格中放置所需的任何类型的小部件。是的,标签可以有边框。虽然,做网格线的一种简单方法是在每个单元格周围使用填充,这样框架的颜色将通过间隙显示。
在框架中执行此操作。如果您需要能够滚动表格,请将框架放在画布中并添加滚动条。 Web上有一些示例,介绍如何使用画布创建可滚动框架。
这是一个非常简单的例子,只使用标签,而不是滚动。我将为读者留下您需要的确切实施。
import Tkinter as tk
class ExampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
t = SimpleTable(self, 10,2)
t.pack(side="top", fill="x")
t.set(0,0,"Hello, world")
class SimpleTable(tk.Frame):
def __init__(self, parent, rows=10, columns=2):
# use black background so it "peeks through" to
# form grid lines
tk.Frame.__init__(self, parent, background="black")
self._widgets = []
for row in range(rows):
current_row = []
for column in range(columns):
label = tk.Label(self, text="%s/%s" % (row, column),
borderwidth=0, width=10)
label.grid(row=row, column=column, sticky="nsew", padx=1, pady=1)
current_row.append(label)
self._widgets.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
def set(self, row, column, value):
widget = self._widgets[row][column]
widget.configure(text=value)
if __name__ == "__main__":
app = ExampleApp()
app.mainloop()
答案 1 :(得分:4)
我找到了一个相当简单的无对象解决方案:
from Tkinter import *
rows = []
for i in range(5):
cols = []
for j in range(4):
e = Entry(relief=RIDGE)
e.grid(row=i, column=j, sticky=NSEW)
e.insert(END, '%d.%d' % (i, j))
cols.append(e)
rows.append(cols)
def onPress():
for row in rows:
for col in row:
print col.get(),
print
Button(text='Fetch', command=onPress).grid()
mainloop()
或
# simple 2d table
from Tkinter import *
for i in range(5):
for j in range(4):
l = Label(text='%d.%d' % (i, j), relief=RIDGE)
l.grid(row=i, column=j, sticky=NSEW)
mainloop()
获取
答案 2 :(得分:0)
如何通过字典创建表格:
my_dict = {
1: {'Header1': 'Row1_Value1', 'Header2': 'Row1_Value2', 'Header3': 'Row1_Value3', },
2: {'Header1': 'Row2_Value1', 'Header2': 'Row2_Value2', 'Header3': 'Row2_Value3', },
}
# Create the header
for column, header in enumerate(my_dict[1]):
Label(self, text=header).grid(row=0, column=0+column)
# Fill in the values
for row, element in enumerate(my_dict.values()):
for column, (header, value) in enumerate(element.items()):
Label(self, text=value).grid(row=1+row, column=0+column)