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)