• Как работать одновременно с несколькими экземплярами класса?

    @bbkmzzzz
    Незачто)
    Когда вызывается функция, или метод, переданные параметры вычисляются, а уже потом передаются.
    def bar(arg):
        return arg + 3
    
    def foo(arg):
        return arg + 1
    
    x = print(foo(bar(5))
    # выполнение bar(5) -> передача результата в foo() -> передача результата в print() -> присваивание результата в х. (print возвращает None)
    print(x)
  • Как работать одновременно с несколькими экземплярами класса?

    @bbkmzzzz
    я бы переписал generator() так:

    def generator():
        result = []
        counter = 0
        while True:
            critName = input('Как назовёте зверюшку? Введите имя: (0, для выхода)')
            try:
                if int(critName) == 0:
                    return result
            except ValueError:
                result.append(NewCritter(critName, counter))
            counter += 1

    Писал тут, так что могут быть опечатки)
    Ну и поменять класс NewCritter, дабы он принимал 2 аргумента. Первый name, второй ids
  • Как работать одновременно с несколькими экземплярами класса?

    @bbkmzzzz
    Значит области видимости не поняты еще)
    Сейчас разберем.
    Кстати, может форматирование съехало, но отступы в питоне критичны. При таком форматировании кода цикла, итерация будет только одна, т.к. return завершит выполнение функции.

    Форматирование поправлено.
    for crit in critters:      # 1
        crit_name = input('Как назовёте зверюшку? Введите имя: ')  # 2
        crit = NewCritter(name=crit_name)  # 3
    return critters  # 4


    1.Шаг итерации, итерирование по списку critters, создается локальная для цикла переменная crit, в которую записывается значение текущего элемента элемента списка.
    2. Создаем локальную для цикла переменную crit_name и записываем в нее пользовательский ввод.
    3. !!! Перезаписываем локальную для цикла crit !!! новым объектом, экземпляром класса NewCritter. В данном случае, переменная crit является локальной для цикла и хранит текущий объект итерации, при ее перезаписи изменится только она, исходный список не меняется !!!
    Идем в пункт 1, удаляя все локальные переменные! (crit_name, crit)
    Внимание на пункт 3.
    Итоговый список НЕ изменен.

    Работащий вариант: (форматирование подправил)

    counter = 0  # 1
    for i in critters:  # 2
        crit_name = input('Как назовёте зверюшку? Введите имя: ')  # 3
        critters[counter] = NewCritter(name=crit_name)  # 4
        counter += 1  # 5
    return critters


    1. Создание локальной для функции переменной counter
    2. Шаг итерации, итерирование по списку critters, создается локальная для цикла переменная crit, в которую записывается значение текущего элемента элемента списка.
    3. Создаем локальную для цикла переменную crit_name и записываем в нее пользовательский ввод.
    4. Вот она, разница. В ИСХОДНОМ СПИСКЕ, на позицию counter записываем новые данные, а именно: свежесозданный экземпляр класса NewCritter
    5. комментарии излишни)
    Идем в пункт 1.

    Разница вот где зарыта. Но так лучше не делать. Изменять список, по которому идем циклом очень не хорошо, тут все нормально, а если изменить количество элементов - будет либо IndexError, либо не пройденный элемент. Либо заранее создавайте новый список и добавляйте экземпляры туда, либо меняйте логику работы.

    пытаюсь для каждой строки создать объект класса NewCritter.

    Тут подход не с той стороны) Вам нужен объект с идентификатором строкой, а не объект для идентификатора)
  • Как сделать кнопку Stop активной в приложении PyQT5?

    @bbkmzzzz
    там ничего особо сложного нет, будет что непонятно, пишите вопрос, распишу)
  • Как сделать кнопку Stop активной в приложении PyQT5?

    @bbkmzzzz
    Еще нужно учитывать, что обработка сигналов идет в основном цикле GUI, и если есть долго выполняющие функции, нажатие не обработается до их завершения, а интерфейс будет заблокирован
  • Как сделать кнопку Stop активной в приложении PyQT5?

    @bbkmzzzz
    pushButton она же стоп, верно?
    Вам нужен флаг активности в классе, например:
    self.isProcessActive = False
    и при клике на любую из кнопок вызывать функцию, которая будет выбирать: начать процесс или закончить его.
    def __choose(self):
        if self.isProcessActive:
            # делаем стоп
            self.isProcessActive = False
        else:
            # делаем старт
            self.isProcessActive = True
  • Как сделать кнопку Stop активной в приложении PyQT5?

    @bbkmzzzz
    кстати, зачем? тут ошибка глубины рекурсии будет
    def stop(self):
            self.stop()
  • Как работать одновременно с несколькими экземплярами класса?

    @bbkmzzzz
    whoareyoutofuckinglecture, вся магия в return.
    когда Вы создаете какую-либо функцию, для нее выделятся пространство имен, после выхода из функции, пространство очищается. Эти данные называются локальные для функции.
    def foo():
        x = 10
        y = 3
        z = x + y
    
    def bar():
        x = 7
        y = 3
        z = x + y
    
    foo()
    bar()
    print(x)  #
    print(y)  #
    print(z)  # будут ошибки, так как переменные существуют только в процессе выполнения функции

    если в функции нет return, то он есть, но скрыт (утрируя)). Функция без return возвращает None.
    def foo():
        x = 10
    
    print(foo())

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

    def foo():
        x = 10
        return x
    
    print(foo()) # выведет 10

    когда Вы создавали список внутри функции и не возвращали, он закономерно удалялся. return возвращает объект в предыдущее пространство видимости.

    Да, не важно, что лежит в списке, обратиться к любому элементу можно по индексу. это же справедливо и для кортежей, и для строк.
    При проходе по списку (итерации) в любом цикле на место счетчика подставляется текущий элемент списка:
    Например:
    x = ['a', 'b', 'foo', 'bar', 10, {'spam': 'eggs'}]
    
    for i in x:   # на каждом проходе цикла в i будет подставляться текущий элемент
        print(i)

    Тут все очень не хорошо:
    counter = 0
        for i in critters:
            crit_name = input('Как назовёте зверюшку? Введите имя: ')
            critters[counter] = NewCritter(name=crit_name)
            counter += 1
        return critters

    1. НИКОГДА не изменяйте список по которому проходите циклом!
    2. Только если хорошо понимаете что будет происходить в цикле, но лучше п.1
    2. Счетчик не нужен -> предыдущий абзац
    3. Все в питоне есть объект, включая встроенные типы. У списков есть метод append(), он добавляет объект в конец списка. Тут подробнее о списках

    Зачем такая запутанная конструкция?
    while counter != num:
            counter += 1
            critters.append(string + str(counter))
    
        for crit in critters:  # не работает
            crit_name = input('Как назовёте зверюшку? Введите имя: ')
            crit = NewCritter(name=crit_name)
        return critters

    мы получаем количество зверюшек и хотим создать их объекты, а также дать им имена.
    Так сделаем все сразу!
    while counter != num:
        crit_name = input('Как назовёте зверюшку? Введите имя: ')
        crit = NewCritter(name=crit_name) # объект локальный для функции
        critters.append(crit) # помещаем объект в список
        counter += 1
    # отпечатаем что получилось
    for crit in critters: # i чаще всего используется в итераторах, но имя не ограничено ничем, практически.
        print(crit)
    return critters # возвращаем список с объектами


    если нужно в объекте зверушки хранить что-то вроде идентификатора ( я так понимаю string + str(counter) это оно) задайте его как атрибут класса
    while counter != num:
        crit_name = input('Как назовёте зверюшку? Введите имя: ')
        crit = NewCritter(name=crit_name) # объект локальный для функции
        crit.ids = string + str(counter)
        critters.append(crit) # помещаем объект в список
        counter += 1
    # отпечатаем что получилось
    for crit in critters: # i чаще всего используется в итераторах, но имя не ограничено ничем, практически.
        print(crit, crit.ids)
    return critters # возвращаем список с объектами


    UPD:
    А что будет если пользователь прикольнется и введет количество -10?)
  • Как работать одновременно с несколькими экземплярами класса?

    @bbkmzzzz
    Объекты у Вас создавались, но после выхода из функции сборщик мусора все удалял, так как хранили объекты Вы в локальной переменной функции.

    Не используйте globals() и eval(), если точно не знаете зачем Вам это)
  • Как получать ошибки из функции в питоне?

    @bbkmzzzz
    лучше так:
    try:
           Пробуем что то сделать например взять данные с сайта.
            return данные
                   
        except Exception as exc:
            return "Не могу подключиться!", exc.args
            pass
  • Почему не работает import в Python?

    @bbkmzzzz
    при импорте модуля:
    import test_function
    test_function.abc()

    импорт всего содежимого:
    from test_function import *
    abc()
  • Как сделать "кликабельные" карточки?

    @bbkmzzzz
    Используйте механизм сигналов и слотов. Вот документация. Весь Qt активно их использует, без изучения сигналов/слотов мало что получится.

    вот пример.
    import sys
    
    from PyQt5.QtWidgets import QApplication, QListWidget, QListWidgetItem
    
    
    class Main(QListWidget):
        def __init__(self):
            super(Main, self).__init__()
            self.addItem(QListWidgetItem('Item0'))
            self.addItem(QListWidgetItem('Item1'))
            self.addItem(QListWidgetItem('Item2'))
            self.addItem(QListWidgetItem('Item3'))
            self.addItem(QListWidgetItem('Item4'))
            self.addItem(QListWidgetItem('Item5'))
            self.addItem(QListWidgetItem('Item6'))
    
            # связываем сигналы виджета и методы обработки
            self.itemSelectionChanged.connect(self._onSelectionChanged)  # сигнал изменения выделения
            self.itemClicked.connect(self._onClick)  # сигнал клика по элементу
    
        def _onClick(self, item):
            print('Click event on item:', item.text(), item)
    
        def _onSelectionChanged(self):
            print('Selection changed, current selection:', self.selectedItems())
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Main()
        ex.show()
        sys.exit(app.exec_())
  • Как реализовать поиск элементов в QComboBox при вводе с клавиатуры?

    @bbkmzzzz
    когда QComboBox в фокусе - следите за событиями клавиатуры и перемещайте выделение на нужную строку
  • Как узнать, по какой кнопке я кликнул на pyqt5?

    @bbkmzzzz
    в функции обработки сигнала вызвать метод sender() основного виджета, он вернет ссылку на объект, который сгенерировал текущий сигнал.
  • Почему окно выглядит настолько плохо?

    @bbkmzzzz
    вам нужно собрать правильный манифест для exe файла и в нем включить использование последней версии графической библиотеки.
    Вот хорошая статья
  • Как сделать "кликабельные" карточки?

    @bbkmzzzz
    Если делаете не через MVC, а используете QListWidget, то там тоже самое, QListWidget генерирует события QListWidget Signals. Подписываетесь через connect и обрабатываете.