首先,是@Bryan Oakley的大声疾呼,因为他们在这里提供了一个很好的答案:[Creating a table look-a-like Tkinter让我开始着手解决自己想做的事情。
目标:为我的无赖游戏创建一个简单的“角色表”。 (超级,简单化的基于文本的游戏),在Tkinter中使用Grid Geometry作为我的UI。
Process:我想学习如何像表格一样创建网格并将统计信息放置在每个插槽中(现在,我只是使用占位符字符串格式,以方便Bryan Oakley的早期参考。回答。]
问题:我试图修改第8、29和30行以将“ columnspan”包括在内。 Columnspan通常是一个参数,它在许多小部件中起作用,以使一个项目占据更多的“槽”。
原始代码在第8行中没有6,在第29行中具有columnpan,在第30行中没有[columnspan]。
我尝试过的一些事情:
我尝试注释掉第25行中的for column in range
位,以删除表的weight=1
组件。这并没有留下任何明显的印象(实际上,代码完全没有它的原始状态就可以工作。)
我曾尝试更改第29行中columnspan, value
部分的顺序,因为我认为可能把columnpan after值引起了问题(实际上确实引起了另一个问题。)这就是为什么我现在有columnpan before值。
我尝试在set方法中创建新行,以将columnspan
作为配置添加到小部件。
# begin tkinter sample unit menu
import tkinter as tk
class ExampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
t = SimpleTable(self, 4, 6)
t.pack(side="top", fill="x")
t.set(0, 0, 6, "Hello, world")
class SimpleTable(tk.Frame):
def __init__(self, parent, rows=4, columns=6):
# 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, columnspan, value):
widget = self._widgets[row][column][columnspan]
widget.configure(text=value)
if __name__ == "__main__":
app = ExampleApp()
app.mainloop()
期望:我希望输出结果允许使用columnspan参数,从而使整个第一列成为单个块,并在顶部显示“ Hello,world”。
结果:我收到以下错误:
Traceback (most recent call last):
File "tkintersampleunitmenu.py", line 35, in <module>
app = ExampleApp()
File "tkintersampleunitmenu.py", line 8, in __init__
t.set(0, 0, 6, "Hello, world")
File "tkintersampleunitmenu.py", line 31, in set
widget = self._widgets[row][column][columnspan]
File "/Users/#/anaconda3/lib/python3.6/tkinter/__init__.py", line 1486, in cget
return self.tk.call(self._w, 'cget', '-' + key)
***TypeError: must be str, not int***
我掌握(或可能无法掌握)的是python期望columnspan
是字符串吗?但为什么?为什么它不查找像行/列这样的整数?
[执行widget[x]
时,tkinter将其视为widget.cget(x)
。您传入的是整数,并且整数不是cget
的适当参数,该参数需要小部件选项的名称(背景,边框宽度等)。