Форум сайта python.su
Передо мной стоит задача запустить телеграм бота по нажатию кнопки в окне.
Есть форма, созданная с использованием библиотеки PyQt5:
#mainwindow.py class MainWindow(QMainWindow): def __init__(self): super().__init__() # Бла бла бла def ClickButton(self): ЗАПУСК БОТА
#mainbotmodule.py class MainBot: def __init__(self, parent = 0, online=0, voice=0): def GetAnswer(self.text): #Бла бла return answer
#TelegramBot.py # -*- coding: utf-8 -*- import time import telebot import config bot = telebot.TeleBot(config.token) @bot.message_handler(func=lambda message: True, content_types=['text']) def send_msg(message): bot.send_message(message.chat.id, message.text) if __name__ == '__main__': bot.polling(none_stop=True)
#config.py token = '000' from main import bot # Обработчик команд '/start' и '/help'. @bot.message_handler(commands=['start', 'help']) def send_welcome(message): bot.reply_to(message, """бла бла """) pass # Обработчик для документов и аудиофайлов @bot.message_handler(content_types=['document', 'audio']) def handle_docs_audio(message): pass #Обработчик сообщений, подходящих под указанное регулярное выражение @bot.message_handler(regexp="SOME_REGEXP") def handle_message(message): pass # Обработчик сообщений, содержащих документ с mime_type 'text/plain' (обычный текст) @bot.message_handler(func=lambda message: message.document.mime_type == 'text/plain', content_types=['document']) def handle_text_doc(message): pass
Офлайн
В общем открыл для себя такое понятие как “декоратор” и вроде бы что-то навоял. Но появилась ее одна проблема. В телеграме бот работает, но интерфейс программы во время его работы полностью блокируется. Даже для того, чтобы просто выключить бота мне приходится экстрено завершать работу программы.
вот как это выглядит:
class MainWindow(QMainWindow): def __init__(self): super().__init__() uic.loadUi("ui/mainwindow.ui", self) self.LocalBot = MainBot(self) self.TeleBot = telebot.TeleBot(config.token) @self.TeleBot.message_handler(func=lambda message: True, content_types=['text']) def send_msg(message): self.TeleBot.send_message(message.chat.id, self.LocalBot.GetAnswer(message.text)) self.startTele.triggered.connect(self.StartTelegram) def StartTelegram(self): # Здесь интерфейс блокируется self.TeleBot.polling(none_stop=True) # До сюда выполнение не доходит self.labToolBar = QLabel('<font color=green>Бот запущен в Telegram<font>') def StopTelegram(self): self.TeleBot.stop_polling() self.labToolBar = QLabel('<font color=red>Бот не запущен в Telegram<font>')
Офлайн
А какой смысл запускать его из десктопного приложения?
> Как исправить, чтобы интерфейс не блокировался
Запускать бота в отдельном потоке.
Офлайн
RodegastСмысл в удобстве управления всем из одного окна.
А какой смысл запускать его из десктопного приложения?
RodegastЭто само собой разумеется. А как это сделать? Вот я создам отдельно класс для телебота и проинициализирую его в переменной внутри класса mainwindow. А как сделать чтобы методы телебота выполнялись в отдельном потоке, независимо от mainwindow, не запуская отдельный скрипт ?
Запускать бота в отдельном потоке.
Офлайн
> Это само собой разумеется. А как это сделать?
Ну про это уже сотню раз писали http://python.su/forum/topic/24662/?page=2#post-130903
Офлайн
RodegastЭто устаревшая информация по PyQt4, которая не актуальна в PyQt5. Там слоты по-другом сейчас коннектятся, и содержимое библиотек немного поменялось
> Это само собой разумеется. А как это сделать? Ну про это уже сотню раз писали http://python.su/forum/topic/24662/?page=2#post-130903
Офлайн
И в чём проблема?
Офлайн
RodegastВ том, что я не могу интерпретировать строчку
И в чём проблема?
QtCore.QObject.connect(self.potok, QtCore.SIGNAL("PotokValue(PyQt_PyObject)"), self.labels_output)
Офлайн