Python/ttk/tKinter - передать аргумент с помощью кнопки click func?

Я пытаюсь передать аргумент функции нажатия кнопки и сталкиваюсь с проблемами.

Короче говоря, я пытаюсь получить нажатие кнопки, чтобы выскочить askColor() метод и вернуть это значение цвета в качестве цвета фона соответствующего текстового поля.

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

конкретные строки:

    self.boxA = Text(self.mainframe, state='normal', width=3, height=1, wrap='word', background=self.AVal).grid(column=2, row=2, padx=4)
    self.boxB = Text(self.mainframe, state='normal', width=3, height=1, wrap='word', background=self.AVal).grid(column=3, row=2, padx=4)
    self.boxC = Text(self.mainframe, state='normal', width=3, height=1, wrap='word', background=self.AVal).grid(column=4, row=2, padx=4)

    self.ABlob = ttk.Button(self.mainframe, text="A",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxA)).grid(column=2, row=3)
    self.BBlob = ttk.Button(self.mainframe, text="B",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxB)).grid(column=3, row=3)
    self.CBlob = ttk.Button(self.mainframe, text="C",style= 'mainSmall.TButton', command= lambda: self.getColour(self.boxC)).grid(column=4, row=3)

а также:

def getColour(self,glyphRef):
    (triple, hexstr) = askcolor()
    if hexstr:
            glyphRef.config(bg=hexstr)

Проблема в том, что я не могу ссылаться self.ABlob как я пытаюсь - он возвращает тип None, Я пытался в том числе pack.forget Команду в кнопке нажмите func, но это также не работает.

1 ответ

Решение

Основная часть вашего вопроса выглядит так:

Проблема в том, что я не могу ссылаться на self.ABlob так, как я пытаюсь - он возвращает тип None

Когда вы делаете x=ClassA(...).func(...), х содержит результат вызова func, Таким образом, когда вы делаете self.ABlob = ttk.Button(...).grid(...)что хранится в self.ABlob является Noneпотому что это то, что возвращается функцией сетки.

Если вы хотите сохранить ссылку на кнопку, вам нужно создать кнопку, а затем вызвать сетку в виде двух отдельных шагов:

self.ABlob = ttk.Button(...)
self.ABlob.grid(...)

Лично я считаю это лучшей практикой, особенно когда вы используете сетку. Поместив все ваши операторы сетки в блок, становится проще визуализировать макет и выявлять ошибки:

self.ABlob.grid(row=3, column=2)
self.BBlob.grid(row=3, column=3)
self.CBlob.grid(row=3, column=4)
Другие вопросы по тегам