Nano Hash - криптовалюты, майнинг, программирование

Python Tkinter передает себя в качестве параметра команды кнопки

У меня нубский вопрос:

Я пытаюсь создать класс «Поле», который наследует все от класса кнопок Tkinter, но также содержит дополнительный атрибут «местоположение» и метод для получения этого атрибута. Реализовав это, я создаю экземпляр нового класса «Поле» и пытаюсь заставить команду поля вызывать свою функцию, чтобы получить атрибут местоположения:

from Tkinter import *

class Field(Button):
    def __init__(self, location, **k):
        Button.__init__(self, **k)
        self.location = location

    def getLoc(self):
        return self.location

root=Tk()
c = Field(2, text="Text", command = lambda: self.getLoc)
c.pack()
root.mainloop()

Появляется корневое окно с кнопкой, но при ее нажатии возникает следующая ошибка:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__
    return self.func(*args)
  File "C:\Users\PC\Desktop\test2.py", line 12, in <lambda>
    c = Field(2, text="Text", command = lambda: self.getLoc)
NameError: global name 'self' is not defined

Что я должен сделать, чтобы он увидел тот факт, что я хочу, чтобы недавно созданный экземпляр «Поля» был «я», местоположение которого он должен возвращать?

заранее спасибо


Ответы:


1

Изменить: извините, я полностью ошибся в исходном ответе о выполнении lambda self: self.getLoc, исправлен ответ (и на этот раз проверен запуском кода!)

Вероятно, вам следует настроить команду после создания кнопки, чтобы вы могли явно ссылаться на кнопку.

root=Tk()
c = Field(2, text="Text")
c.config(command=c.getLoc)
c.pack()
root.mainloop()    

Вы можете узнать больше о методе конфигурации объектов Tkinter (и многом другом) на effbot.org.

02.01.2015
  • Спасибо! Это помогло. Я думаю, это имеет смысл, поскольку я еще не существует на самом деле, когда я пытаюсь передать команду во время создания экземпляра поля. Так же спасибо за информацию по конфигу, обязательно пригодится. (Извиняюсь за отсутствие +1, не могу из-за низкой репутации :() 02.01.2015
  • @ sv1, хотя вы не можете голосовать, вы можете принять этот ответ, нажав на галочку. 02.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..