Приложение PyQt5 с сопрограммой PythonTelegramBot (PTB)Python

Программы на Python
Ответить
Anonymous
 Приложение PyQt5 с сопрограммой PythonTelegramBot (PTB)

Сообщение Anonymous »

Я пытаюсь запустить python-telegram-bot-21.10 в качестве сопрограммы для приложения PyQt5, использующего Python-3.12.7 (предназначенного для работы на Raspberry Pi).
У меня этот параметр работал уже несколько лет с Python-3.9 и python-telegram-bot-13.6, запуская телеграмм-бота в отдельном потоке путем создания экземпляра класса («TelegramBot»). наследующий от QThread. Из основного приложения (PyQt5) я просто вызвал функцию .start() в экземпляре «TelegramBot», которая по умолчанию вызывает виртуальную функцию run(), (повторно) реализованную. в классе после запуска потока.

Код: Выделить всё

from PyQt5.QtCore import QThread
from telegram.ext import Updater, CommandHandler

class TelegramBot(QThread):
def __init__(self, parent=None):
super(TelegramBot, self).__init__(parent)

def run(self):
self.updater = Updater(API_KEY, use_context = True)
dp = self.updater.dispatcher
#dp.add_handler(CommandHandler("start", self.start_command))
self.updater.start_polling(5)

def stop(self):
self.updater.stop()
self.quit()
self.wait()
Однако, пытаясь обновить все приложение до Python-3.12 и python-telegram-bot-21.10, мне не удалось добиться такого же поведения. Прочитав документацию PTB, я думаю, что в более новых версиях его реализация изменилась для использования асинхронных процедур.
Я пытался обновить свой класс TelegramBot до нового синтаксиса (используя async-await), но получил RuntimeWarning: включите трассировку, чтобы получить обратная трассировка выделения объекта:

Код: Выделить всё

def run(self):
application = ApplicationBuilder().token(API_KEY).build()

application.add_handler(CommandHandler("start", self.start_command))
application.run_polling(allowed_updates=Update.ALL_TYPES)

async def start_command(self, update, context):
await context.bot.send_message(chat_id=update.effective_chat.id, text='You sent /start!')
При рассмотрении этой записи об использовании неблокирующих функций опроса я попытался запустить ее без отдельного потока, например:

Код: Выделить всё

async def run(self):
application = ApplicationBuilder().token(API_KEY).build()
application.add_handler(CommandHandler('start', self.start))
await application.initialize()
await application.start()
await application.updater.start_polling()
вызвав из основного приложения/потока следующую команду:

Код: Выделить всё

self.bot = TelegramBot()
asyncio.run(self.bot.run())
Но бот по сути просто не ответил ни на один запрос, хотя и не показывал никаких ошибок.
Я новичок в этом деле. асинхронное программирование и не могу уяснить это. Я был бы признателен за любые подсказки в правильных направлениях или альтернативные предложения по дополнительному запуску бота Telegram в качестве сопрограммы, нажав кнопку в приложении PyQt5!

Подробнее здесь: https://stackoverflow.com/questions/793 ... -coroutine
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»