Во-первых, огромное спасибо @Bryan Oakley, который помог с отличным ответом здесь: [ Создание таблицы, похожей на Tkinter , которая заставила меня начать решать то, что я хотел сделать впервое место.
Цель : Создать упрощенный «лист персонажа» для моей игры, похожей на жулика. (супер, упрощенная текстовая игра), используя Grid Geometry в Tkinter для моего пользовательского интерфейса.
Процесс : я хотел научиться создавать сетку в виде таблицы и размещать статистикув каждом слоте (сейчас я просто использую форматирование строки-заполнителя для удобства ссылок из предыдущего ответа Брайана Оукли.)
Проблема : я пытался изменить строки 8, 29и 30, чтобы включить "columnspan" в качестве аргумента. Columnspan обычно является аргументом, который работает в ряде виджетов, позволяя элементу занимать больше «слотов».
В исходном коде не было 6 в строке 8, columnspan в строке 29 и [columnspan] в строке30.
Некоторые вещи, которые я пробовал :
Я попытался закомментировать бит for column in range
в строке 25, чтобы удалить weight=1
компонент таблицы. Это не произвело существенного впечатления (на самом деле код работает в своем исходном состоянии без этого вообще.)
Я попытался изменить порядок раздела columnspan, value
в строке 29, какЯ подумал, что, возможно, поместив значение columnpan после , значение стало причиной проблемы (на самом деле это вызвало совсем другую проблему). Именно поэтому у меня теперь есть columnspan до значения.
Я попытался создать новую строку в методе 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
будет строкой? Но почему? Почему бы не искать целое число, как в строке / столбце?