• Как в потоке ожидать завершение функции, вызванной сигналом, и получить значение из этой функции?

    @bbkmzzzz
    self.signal_deer_2fa.emit()
    tfa_code = ... (из функции сигнала как-то))
    - что?

    функция, которая вызывается при испускании сигнала:
    при испускании сигнала, внезапно, испускается сигнал, а не выполняется функция. Код выполнится, когда до связанного слота дойдет очередь.

    Правильно понимаю, что нужно в стороннем потоке обрабатывать сигналы?
  • Завершение работы Python при выполнения кода PyQt5. Как это исправить?

    @bbkmzzzz
    Где минимально запускабельный код?
    Какой ошибкой завершается?
    Что за метод saving_sgl?
  • Почему не работает print?

    @bbkmzzzz
    print(f"save_user_id ({type(save_user_id)}): {save_user_id}")

    что выведет?
  • Почему зависают всплывающие окна, вызванные в потоке?

    @bbkmzzzz
    import sys
    
    from PySide2.QtCore import QThread, Signal
    from PySide2.QtWidgets import QApplication, QPushButton, QWidget
    
    
    class Main(QWidget):
        def __init__(self):
            super(Main, self).__init__()
            self.resize(300, 50)
    
            self.pb = QPushButton(self)
            self.pb.resize(300, 50)
            self.pb.setText('start')
            self.pb.clicked.connect(self.start_thread)
    
            self.thread = Worker()
            self.thread.some_signal.connect(self.__on_some_signal)  # стандартный коннект сигнала и слота
    
        def start_thread(self):
            self.thread.start()
    
        def __on_some_signal(self):
            print('test')
            self.pb.setText('some thread done!')
    
    
    class Worker(QThread):
        some_signal = Signal()  # таки новый сигнал
    
        def __init__(self):
            super(Worker, self).__init__()
    
        def run(self):
            print('start looooong function')
            QThread.sleep(1)
            self.some_signal.emit()  # испускаем наш сигнал
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = Main()
        ex.show()
        sys.exit(app.exec_())
  • Почему зависают всплывающие окна, вызванные в потоке?

    @bbkmzzzz
    QThread не наследник QObject, и не может испускать ничего
    - ошибка, в 5.12 - наследник, а значит может испускать сам
  • Почему зависают всплывающие окна, вызванные в потоке?

    @bbkmzzzz
    Это точно такие же как и остальные.
    Их нет "встроенных" для этих целей, а сам QThread не наследник QObject, и не может испускать ничего. Заведите класс, которому добавьте сигнал, подпишитесь на него и испускайте при необходимости
  • Почему когда импортирую пакет из модуля с помощью importlib, импортируется весь модуль?

    @bbkmzzzz
    да, неужели?
    а про механизм импорта ты читал? функцию от пакета отличить в состоянии?
    a = import_module('time', package='sleep')
    <- package не смущает?
    importlib.import_module(name, package=None)
    Import a module. The name argument specifies what module to import in absolute or relative terms (e.g. either pkg.mod or ..mod). If the name is specified in relative terms, then the package argument must be set to the name of the package which is to act as the anchor for resolving the package name (e.g. import_module('..mod', 'pkg.subpkg') will import pkg.mod).

    The import_module() function acts as a simplifying wrapper around importlib.__import__(). This means all semantics of the function are derived from importlib.__import__(). The most important difference between these two functions is that import_module() returns the specified package or module (e.g. pkg.mod), while __import__() returns the top-level package or module (e.g. pkg).

    If you are dynamically importing a module that was created since the interpreter began execution (e.g., created a Python source file), you may need to call invalidate_caches() in order for the new module to be noticed by the import system.

    Changed in version 3.3: Parent packages are automatically imported.
  • Можно ли ограничить частоту нажатия на кнопку Inline - Telegram bot?

    @bbkmzzzz
    ответ уже был.
    lback_query_handler(func=lambda call: call.data == "requestphoto1")
    def test_callback(call):
        # считываем текущее время
        tm_now = time()
        #  сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
        # если условия по времени не удовлетворяют требованиям
        if (tm_now - tm_last) < treshold:
             # завершаем функцию. если времени прошло меньше, чем порог
            return
        files = []
        for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
            [files.append(file) for file in glob.glob(f"test/*.{ext}")]
    
        random_file = files[random.randint(0, len(files) - 1)]
    
        with open(random_file, 'rb') as f:
            bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
    
        bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
  • Можно ли ограничить частоту нажатия на кнопку Inline - Telegram bot?

    @bbkmzzzz
    Учите питон, практикуйтесь на чем-то простом, потом переходите на ботов. Очень много объяснять, для формата тостера, учебник сюда тоже переписывать не очень.
    time() - функция из модуля time, который надо импортировать.
    from time import time
    print(time())


    treshold - пороговой значение, в данном случае - порог разницы во времени, с которым сравнивается реальные значения. treshold надо где-то задать, так просто она не существует.
    Подсчет количества секунд в 30 минутах, этот вопрос точно на тостере надо задавать? Давайте подумаем. В 1 минуте - 60 секунд, в 30 минутах - 60*30=1800 секунд, если нам надо ограничить 30 минутами - treshold = 1800
    from random import randint
    from time import time, sleep
    
    tm_last = time()  # храним тут последнее зафиксированное время (секунды)
    treshold = 5  # пороговое значение (секунды)
    
    for _ in range(10):
        sleep(randint(1, 10))  # спим случайное количество секунд из диапозона 1 - 10
        tm_now = time()  # текущее время
        if (tm_now - tm_last) < treshold:
            print(f'(tm_now - tm_last) < treshold | ({tm_now - tm_last}) < {treshold}')
        else:
            print(f'(tm_now - tm_last) > treshold | ({tm_now - tm_last}) > {treshold}')
        tm_last = tm_now  # записываем последнее обработанное время


    Учебник
  • Можно ли ограничить частоту нажатия на кнопку Inline - Telegram bot?

    @bbkmzzzz
    @bot.callback_query_handler(func=lambda call: call.data == "requestphoto1")
    def test_callback(call):
        # считываем текущее время
        tm_now = time()
        #  сравниваем с временем предыдущего вызова функции ( ведь есть же хранилище, в котором хранится предыдущее время, ведь так?)
        # если условия по времени не удовлетворяют требованиям
        if (tm_now - tm_last) < treshold:
            do_something()
            return
        files = []
        for ext in ["png", "jpg", "jpeg", "PNG", "JPG", "JPEG"]:
            [files.append(file) for file in glob.glob(f"test/*.{ext}")]
    
        random_file = files[random.randint(0, len(files) - 1)]
    
        with open(random_file, 'rb') as f:
            bot.send_media_group(call.message.chat.id, [types.InputMediaPhoto(f, )])
    
        bot.answer_callback_query(callback_query_id=call.id, text="Отправлено!")
  • Можно ли ограничить частоту нажатия на кнопку Inline - Telegram bot?

    @bbkmzzzz
    Вопрос в чем? какая-то конкретика будет? Код, который не работает?
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    TemaKam,
    да вкладки скрывать не надо будет, только удалять
    ну-ну)
    640кб хватит всем! © Ленин
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    TemaKam, словарь например. Заведите в Task поле для имени вкладки, ищите потом по имени. Но это наложит ограничение на уникальность имен. Вариантов масса)
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    TemaKam,
    а стоп, имя же вкладки не сохраняется в объекте (ну и в списке соответственно)
    если удалю вкладку - объект ведь так и останется?
    ничего страшного?

    какой именно объект? Task? ссылка на него останется в списке, до тех пор, пока существует хоть одна ссылка ничего удалено не будет. Нет смысле пока заморачиваться с памятью, рано, пока это имеет смысл только для удобства работы с данными. Может, захочется сделать возможность "скрывать" вкладку, и тогда ту часть, которая отбражается нужно скрыть, вкладку удалить, а данные оставить. Ну а потом, когда-нибудь восстановить. А вся информация все еще есть и доступна.
    Или сохранять данные из вкладки в файл. вкладку удалили, запустили процесс сохранения информации, удалили данные.
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    продумать зависимости, что и где может ссылаться на него. Возможно, некая сущность, менеджер, которая управляет этими данными, создает их, возвращает, занимается удалением. Больше никто, только он.

    или просто извлечь из списка вникуда
    lst = [123, '123']
    print(lst)
    lst.pop(0)
    print(lst)
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    1 - потому что сборка мусора. Если на объект никто не ссылается - он будет удален.
    2 - в дальнейшем понадобится удалить эти данные, убрать их из интерфейса. Как? Прямых ссылок нет, их не сохранили.
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    отличия тут.
    self.suppliers_and_add_tasks.addTab(Task.new_task(), self.task_name.toPlainText())
    self.suppliers_and_add_tasks.addTab(Task().new_task(), self.task_name.toPlainText())

    вызов метода класса и вызов метода экземпляра класса
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    TemaKam, уже лучше.
    Поехали.
    Ремарка: функция класса называется метод класса. Метод отличает от обычное функции то, что он находится в пространстве имен класса и первым аргументом всегда принимает экземпляр класса, тот самый self

    TypeError: new_task() missing 1 required positional argument: 'self'
    Абсолютно все верно, так как:
    self.suppliers_and_add_tasks.addTab(Task.new_task(), self.task_name.toPlainText())

    Task.new_task()
    метод new_task вызывается не у экземпляра, а у самого класса, соответственно, требуется self
    Ощущаем разницу.
    class Foo:
        def bar(self):
            print('bar')
    
    x = Foo()
    x.bar()
    
    Foo.bar()
    <spoiler title="доп">

    далее, если все-таки надо вызывать метод именно класса, тогда нужен декоратор @staticmethod, и будет выглядеть так:
    class Foo:
        @staticmethod
        def bar():
            print('bar')
    
    x = Foo()
    x.bar()
    
    Foo.bar()


    elf.suppliers_and_add_tasks.addTab(Task.new_task(), self.task_name.toPlainText())
    - экземпляр не создается. В этом одна часть проблемы

    def add_task_f(self):
            created_new_task = Task()  # создаем экземпляр класса Task и присваиваем его имени created_new_task 
            self.tasks.append(created_new_task ) # сохраняем ссылку на экземпляр путем добавления в список tasks основного класса.
            #Можно не делать этого, но надо учитывать, что после выхода из метода, все переменные удаляться.
            # Qt заберет владение этими объектами, но вытаскивать их потом тяжело.
            # я подразумеваю, что self.tasks - создан и существует
    
            # теперь тут мы вызываем метод new_task не класса, а экземпляра класса
            self.suppliers_and_add_tasks.addTab(created_new_task .new_task(), self.task_name.toPlainText())

    Далее.
    С классом Task все нормально, проблема изначально была не в нем. Наследоваться в данном случае не обязательно, так как сам класс Task никак с сигналами не связан.
    super - не нужен, так как он возвращает родительский класс. Ни от чего не наследуемся - super не нужен. (кстати, по умолчанию все объекты унаследованы от object, но это автоматически и скрыто)

    Запускаемся, проверяем
    spoiler
    import sys
    from PyQt5 import QtWidgets, QtGui, QtCore
    from PyQt5.QtGui import QIcon
    
    class Task:
        def __init__(self):
            super().__init__()
            self.tab_2 = QtWidgets.QTabWidget()
            self.tab_2.setObjectName("tab_2")
            self.start_task = QtWidgets.QPushButton(self.tab_2)
            self.start_task.setGeometry(QtCore.QRect(300, 510, 171, 23))
            font = QtGui.QFont()
            font.setPointSize(9)
            self.start_task.setFont(font)
            self.start_task.setObjectName("start_task")
            self.start_task.clicked.connect(self.test)
    
        def new_task(self):
            return self.tab_2
    
        def test(self):
            print('111')
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(1479, 781)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
            MainWindow.setSizePolicy(sizePolicy)
            MainWindow.setMinimumSize(QtCore.QSize(1479, 781))
            MainWindow.setMaximumSize(QtCore.QSize(1479, 781))
            font = QtGui.QFont()
            font.setPointSize(9)
            MainWindow.setFont(font)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
            self.centralwidget.setSizePolicy(sizePolicy)
            self.centralwidget.setMinimumSize(QtCore.QSize(1479, 781))
            self.centralwidget.setMaximumSize(QtCore.QSize(1479, 781))
            self.centralwidget.setObjectName("centralwidget")
            self.all_tabs = QtWidgets.QTabWidget(self.centralwidget)
            self.all_tabs.setGeometry(QtCore.QRect(0, 0, 1479, 781))
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.all_tabs.sizePolicy().hasHeightForWidth())
            self.all_tabs.setSizePolicy(sizePolicy)
            self.all_tabs.setMinimumSize(QtCore.QSize(1479, 781))
            self.all_tabs.setMaximumSize(QtCore.QSize(1479, 781))
            self.all_tabs.setObjectName("all_tabs")
            self.all = QtWidgets.QWidget()
            self.all.setObjectName("all")
            self.supliers_and_tasks = QtWidgets.QWidget()
            self.supliers_and_tasks.setObjectName("supliers_and_tasks")
            self.suppliers_and_add_tasks = QtWidgets.QTabWidget(self.supliers_and_tasks)
            self.suppliers_and_add_tasks.setGeometry(QtCore.QRect(0, 0, 1479, 761))
            sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.suppliers_and_add_tasks.sizePolicy().hasHeightForWidth())
            self.suppliers_and_add_tasks.setSizePolicy(sizePolicy)
            self.suppliers_and_add_tasks.setMinimumSize(QtCore.QSize(1479, 761))
            self.suppliers_and_add_tasks.setMaximumSize(QtCore.QSize(1479, 761))
            self.suppliers_and_add_tasks.setObjectName("suppliers_and_add_tasks")
            self.tab = QtWidgets.QWidget()
            self.tab.setObjectName("tab")
            self.suppliers_and_add_tasks.addTab(self.tab, "")
            self.all_tabs.addTab(self.supliers_and_tasks, "")
            MainWindow.setCentralWidget(self.centralwidget)
            self.groupBox_7 = QtWidgets.QGroupBox(self.tab)
            self.groupBox_7.setGeometry(QtCore.QRect(670, 10, 471, 511))
            self.groupBox_7.setObjectName("groupBox_7")
            self.task_name = QtWidgets.QTextBrowser(self.groupBox_7)
            self.task_name.setGeometry(QtCore.QRect(80, 60, 151, 25))
            self.task_name.setLineWrapMode(QtWidgets.QTextEdit.WidgetWidth)
            self.task_name.setReadOnly(False)
            self.task_name.setAcceptRichText(False)
            self.task_name.setObjectName("task_name")
            self.add_task = QtWidgets.QPushButton(self.tab)
            self.add_task.setGeometry(QtCore.QRect(750, 530, 121, 23))
            self.add_task.setObjectName("add_task")
    
    
    
    
    
    class ExampleApp(QtWidgets.QMainWindow):
        def __init__(self):
            super(ExampleApp, self).__init__()
            self.ui = Ui_MainWindow()
    
            self.ui.setupUi(self)
            self.ui.add_task.clicked.connect(self.add_task_f)
            self.tasks = []
    
    
        # добавление задачи
        def add_task_f(self):
            print('add_task_f')
            created_new_task = Task()
            self.tasks.append(created_new_task)
            
            
            self.ui.suppliers_and_add_tasks.addTab(created_new_task.new_task(), self.ui.task_name.toPlainText())
            
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        window = ExampleApp()
        window.show()
        app.exec_()
    
    
    if __name__ == '__main__':
        main()

    5ff485f4ea0ca635682499.png
  • Почему не привязываются функции на кнопки на создаваемом виджете из моего класса?

    @bbkmzzzz
    , а тут нет даже с наследованием нужно еще что-то предоставить?

    тут это где? там? там нет наследования. Или есть. но не там?

    Скинуть тот код, именно тот, в котором непонятки. Не на котором он основан, а тот с которым проблемы.