Привязка команды флажка к неправильным значениям при создании экземпляра в цикле - PullRequest
0 голосов
/ 05 июня 2019

Когда я нажимаю на кнопку с галочкой в ​​моем проекте, она не выполняет правильную функциональность. Проект можно найти по адресу https://github.com/shitwolfymakes/Endless-Sky-Mission-Builder/ (Indev Branch)

Я создаю приложение с использованием tkinter и работаю над функцией динамического размещения объектов ttk.Entry рядом с объектами ttk.Checkbutton, а затем связываю их вместе.

Я уже несколько раз переписывал эту функцию и даже добавил специальный случай, когда self.numMandatory равен 0, но ничего не помогло.

Это взято из guiutils.py, строка 323.

# add the optional fields
for i in range(self.numMandatory, self.numFields):
    print(self.rowNum)
    self.listEntryStates.append(BooleanVar())
    self.listEntryData.append(StringVar())
    self.listEntryData[-1].set(self.listDefaultEntryData[i])

    self.listEntries.append(ttk.Entry(self, textvariable=self.listEntryData[-1], state=DISABLED, style="D.TEntry"))
    self.listEntries[-1].grid(row=self.rowNum, column=1, sticky="ew")

    #print(self.listEntryStates[-1])
    #print(self.listEntries)
    self.listCheckbuttons.append(ttk.Checkbutton(self, onvalue=1, offvalue=0, variable=self.listEntryStates[-1],
                                                 command=lambda: self.cbValueChanged(self.listEntryStates[-1],
                                                                                     [self.listEntries[-1]])))
    self.listCheckbuttons[-1].grid(row=self.rowNum, column=2, sticky="e")

    print(self.listCheckbuttons[-1].__str__(), end=" is bound to: ")
    print(self.listEntries[-1].__str__(), self.listEntryStates[-1])

    self.rowNum += 1
# end for

Это взято из guiutils.py, строка 349

def cbValueChanged(self, entryState, modifiedWidgets):

    for widget in modifiedWidgets:
        print("The value of %s is:" % widget, end="\t\t")
        print(entryState.get())
        if type(widget) is str:
            break
        elif entryState.get() is True:
            widget.config(state='enabled', style='TEntry')
        elif entryState.get() is False:
            widget.config(state='disabled', style='D.TEntry')
    #end for

#end cbValueChanged

В главном окне, когда я прокручиваю вниз и нажимаю «добавить триггер», новое окно отображается правильно. Но когда я нажимаю на кнопку с галочкой рядом с записью, которая говорит "[<base#>]", эта запись должна быть включена cbValueChanged.

По какой-то причине, когда цикл добавления необязательных полей выполняется, секция command = связывает только последнюю запись в self.listEntries (но запись, с которой она связывает каждую кнопку-флажок, не создается до самого последнего времени через петля)

Я не уверен, где еще я мог бы задать такой вопрос, и я знаю, что он задает больше, чем большинство вопросов. Если вам понадобится дополнительная информация, я с радостью ее предоставлю.

1 Ответ

0 голосов
/ 05 июня 2019

Вы ~~ не можете ~~ редактировать: не следует использовать lambda в цикле. Честно говоря, вы не должны использовать его вообще. Используйте functools.partial или сделайте реальное закрытие.

from functools import partial
self.listCheckbuttons.append(ttk.Checkbutton(self, onvalue=1, offvalue=0, variable=self.listEntryStates[-1],
                                             command=partial(self.cbValueChanged,self.listEntryStates[-1],[self.listEntries[-1]])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...