Запутался, почему я не могу добавить columnpan к этому блоку кода без python, предполагая, что это должен быть str вместо int - PullRequest
0 голосов
/ 13 октября 2019

Во-первых, огромное спасибо @Bryan Oakley, который помог с отличным ответом здесь: [ Создание таблицы, похожей на Tkinter , которая заставила меня начать решать то, что я хотел сделать впервое место.

Цель : Создать упрощенный «лист персонажа» для моей игры, похожей на жулика. (супер, упрощенная текстовая игра), используя Grid Geometry в Tkinter для моего пользовательского интерфейса.

Процесс : я хотел научиться создавать сетку в виде таблицы и размещать статистикув каждом слоте (сейчас я просто использую форматирование строки-заполнителя для удобства ссылок из предыдущего ответа Брайана Оукли.)

Проблема : я пытался изменить строки 8, 29и 30, чтобы включить "columnspan" в качестве аргумента. Columnspan обычно является аргументом, который работает в ряде виджетов, позволяя элементу занимать больше «слотов».

В исходном коде не было 6 в строке 8, columnspan в строке 29 и [columnspan] в строке30.

Некоторые вещи, которые я пробовал :

  1. Я попытался закомментировать бит for column in range в строке 25, чтобы удалить weight=1 компонент таблицы. Это не произвело существенного впечатления (на самом деле код работает в своем исходном состоянии без этого вообще.)

  2. Я попытался изменить порядок раздела columnspan, value в строке 29, какЯ подумал, что, возможно, поместив значение columnpan после , значение стало причиной проблемы (на самом деле это вызвало совсем другую проблему). Именно поэтому у меня теперь есть columnspan до значения.

  3. Я попытался создать новую строку в методе 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 будет строкой? Но почему? Почему бы не искать целое число, как в строке / столбце?

1 Ответ

0 голосов
/ 13 октября 2019

Когда вы делаете widget[x], tkinter рассматривает это как widget.cget(x). Вы передаете целое число, и целое число не является правильным аргументом для cget, который ожидает имя опции виджета (фон, ширина полосы и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...