Как динамически создавать виджеты без указания экземпляра класса c в Tkinter? - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь динамически создавать определенное количество виджетов, а затем иметь возможность их изменять.

Например, мне нужны некоторые флажки:

# Class level lists to store the CheckButtons and their values
self.checkbutton_list = []
self.checkbutton_values_list = []

# With self.amount_of_widgets an integer
for i in range(0, self.amount_of_widgets):
    # We create the value of the current CheckButton, default is 0
    self.checkbutton_values_list.append(IntVar())
    # We create the ChekButton and append it to our list
    self.checkbutton_list.append(Checkbutton(self.canvasR, 
                                     text="rtest : " + str(i),
                                     variable=self.checkbutton_values_list[i],
                                     onvalue=1,
                                     offvalue=0,
                                     height=1,
                                     width=10))
    # As there is a lot of CheckButtons, they have to be browsable inside the canvas 
    # named canvasR, wich has a scrollbar. To browse the created CheckButtons in the 
    # canva, we need to use the create_window function :
    self.canvasR.create_window(x, y, window=self.comp_checkbutton_list[i])
    y = y + 100

Это поколение работает хорошо и я могу создать все нужные виджеты в нужных местах и ​​сохранить их в выделенных списках. Например, я делаю что-то похожее для создания пустых изображений (я хочу обновить эти изображения позже):

for i in range(0, self.amount_of_widgets):
    # With default photo a PhotoImage object stored at class level
    self.photo_list.append(self.default_photo)
    self.photo_area_list.append(self.canvasR.create_image(x, y, 
                                     image=self.photo_list[i], 
                                     anchor=NW))
    y = y + 100

Проблема в том, что я не могу обновить созданные виджеты, если я пытаюсь вызвать .itemconfig() как в В следующем коде я получаю _tkinter.TclError: недопустимый логический оператор в выражении поиска тега :

for i in range(0, self.max_image_displayed):
    self.canvasR.itemconfig(self.checkbutton_list[i], fill='black', text='')

Я понимаю, что он может не работать, поскольку каждый виджет специально не существует для основной класс, потому что они не были явно созданы внутри класса. В этой области существует только список, хранящий их.

Но я не собираюсь объявлять тысячи полей CheckBoxes или Images, одно за другим, вручную в моем коде, например:

self.area1 = self.canvasR.create_image(0, 0, image=self.photoimage1, anchor=NW)
self.area_list.append(self.area1)
self.area2 = self.canvasR.create_image(0, 100, image=self.photoimage2, anchor=NW)
self.area_list.append(self.area2)
# ...
self.area9999 = self.canvasR.create_image(0, 0, image=self.photoimage999, anchor=NW)
self.area_list.append(self.area9999)

Что я мог сделать ?

1 Ответ

1 голос
/ 24 марта 2020

Проблема в том, что я не могу обновить созданные виджеты, если я пытаюсь вызвать .itemconfig (), как показано в следующем коде, я получаю _tkinter.TclError: недопустимый логический оператор в выражении поиска тега

Когда вы вызываете self.canvasR.itemconfig, первый аргумент должен быть идентификатором отдельного элемента на холсте или тегом. Однако вы передаете self.defaultPhoto, который определенно не является идентификатором элемента или тегом.

Другими словами, то, что вы передаете itemconfig, должно совпадать с тем, что возвращается self.canvasR.create_image(...) а не само изображение, если ваша цель - изменить элемент холста, созданный create_image.

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