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

Добавление динамически созданных имен к переменной класса из класса пользовательского интерфейса

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

У меня есть класс Create_Capsules(). Он имеет две функции:

  1. создать куб
  2. создать сферу.

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

Создать капсульный класс (псевдокод):

class Create_Capsule(object):
    def __init__(self):
        super(Create_Capsule, self).__init__()        
        self.user_capsules = []

    def cube(self):
        #psuedo-code
        cap_name = create_cube(name='capsule_cube01')
        self.user_capsules.append(cap_name)
        return cap_name
        
    def sphere(self):
        #psuedo-code
        cap_name = create_sphere(name='capsule_sphere01')        
        self.user_capsules.append(cap_name)        
        return cap_name

У меня есть еще один класс пользовательского интерфейса с двумя простыми QPushButtons, Cube и Sphere. С этих кнопок вызываются функции Create_Capsules().cube() и Create_Capsules().sphere(). В конце этого процесса я хочу иметь возможность запросить переменную класса, чтобы получить список всех созданных капсул.

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

Выдержки из кода пользовательского интерфейса:

Class toolUI(obj):
    addNewBboxLabel = QLabel("Add New Capsule:")
    user_capsule = Create_Capsule()

    addCubeButton = QPushButton("Cube")
    addCubeButton.clicked.connect(self.addCubeClicked(user_capsule))
    # addCubeButton.clicked.connect(functools.partial(self.addCubeClicked), user_capsule)

    addSphereButton = QPushButton("Sphere")
    addSphereButton.clicked.connect(self.addSphereClicked(user_capsule))
    # addSphereButton.clicked.connect(functools.partial(self.addSphereClicked), user_capsule)
    
    def addCubeClicked(self, capsule_obj):
        """
        Adds a cube to the scene 
        """               
        user_cube = capsule_obj.cube()   
        print(user_cube)            
        print(capsule_obj.user_capsules)

    def addSphereClicked(self, capsule_obj):
        """
        Adds a sphere to the scene 
        """               
        user_sphere = capsule_obj.sphere()   
        print(user_sphere)             
        print(capsule_obj.user_capsules)

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

addCubeButton.clicked.connect(self.addCubeClicked(user_capsule))

RuntimeError: не удалось подключить сигнал clicked()

Я могу не беспокоиться о подходе с переменным класса и вместо этого возвращать имя капсулы из функций addCubeClicked() и addSphereClicked(), собирать их в пользовательском интерфейсе и добавлять туда список. Но это кажется грязным, поскольку я не хочу загромождать свою функцию пользовательского интерфейса какой-либо другой логикой. Я чувствую, что мне здесь не хватает ключевой концепции ООП.

25.11.2018

  • изменить addCubeButton.clicked.connect(self.addCubeClicked(user_capsule)) на addCubeButton.clicked.connect(lambda *args, user_capsule=user_capsule : self.addCubeClicked(user_capsule)) 25.11.2018
  • Работает отлично. Спасибо 26.11.2018

Ответы:


1

В вашем классе toolUI вы должны обернуть свой код внутри метода, такого как __init__. Вы также можете добавить self. в свои виджеты.

class toolUI(obj):
    def __init__(self):
        self.addNewBboxLabel = QLabel("Add New Capsule:")
        self.user_capsule = Create_Capsule()

        self.addCubeButton = QPushButton("Cube")
        self.addCubeButton.clicked.connect(self.addCubeClicked(self.user_capsule))

        self.addSphereButton = QPushButton("Sphere")
        self.addSphereButton.clicked.connect(self.addSphereClicked(self.user_capsule))

Частично причина заключалась в том, что в вашем коде не существовало уникального экземпляра класса, а self не была определенной переменной. Размещение его внутри метода с параметром self определит эту переменную для использования, а также позволит другим методам получить доступ к свойствам, принадлежащим этому объекту (например, self.addCubeButton).

25.11.2018
  • Спасибо за предложения. user_capsule действительно находился внутри def __init__(self). Я просто забыл упомянуть об этом. Но я добавил себя к переменным и виджетам, как вы предложили. Но я все еще получаю ту же проблему. Однако использование лямбда, предложенное @eyllanesc, работает и делает то, что мне нужно. Еще раз спасибо за ваши предложения. Мне все еще любопытно, почему предложенный вами метод не сработал для меня. Отвечу, если узнаю почему 26.11.2018
  • Новые материалы

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

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

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

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

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

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

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