Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2018 17:36:11

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

Передо мной стоит задача запустить телеграм бота по нажатию кнопки в окне.

Есть форма, созданная с использованием библиотеки 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

И есть файлы телеграм бота, который пока только работает в режиме эха, а должен после нажатия на кнопку формы MainWindow один раз проинициализировать переменную класса MainBot, получать в нее вопросы и возвращать ответы в телеграм.

 #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

Как мне обратиться к переменной bot и заставить ее в методе send_message использовать класс MainBot, который после запуска бота в телеграм должен проинициализироваться только 1 раз, чтобы бестолку не насиловать сервер базы данных? Или, может быть, можно как-то создать цельный класс телеграм бота, который я смогу проинициализировать внутри MainWindow и оттуда его запустить?

Офлайн

#2 Янв. 31, 2018 09:38:13

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

В общем открыл для себя такое понятие как “декоратор” и вроде бы что-то навоял. Но появилась ее одна проблема. В телеграме бот работает, но интерфейс программы во время его работы полностью блокируется. Даже для того, чтобы просто выключить бота мне приходится экстрено завершать работу программы.

вот как это выглядит:

 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>')

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

Офлайн

#3 Янв. 31, 2018 09:59:15

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

А какой смысл запускать его из десктопного приложения?

> Как исправить, чтобы интерфейс не блокировался

Запускать бота в отдельном потоке.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Янв. 31, 2018 10:16:56

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

Rodegast
А какой смысл запускать его из десктопного приложения?
Смысл в удобстве управления всем из одного окна.
Rodegast
Запускать бота в отдельном потоке.
Это само собой разумеется. А как это сделать? Вот я создам отдельно класс для телебота и проинициализирую его в переменной внутри класса mainwindow. А как сделать чтобы методы телебота выполнялись в отдельном потоке, независимо от mainwindow, не запуская отдельный скрипт ?

Офлайн

#5 Янв. 31, 2018 10:38:54

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

> Это само собой разумеется. А как это сделать?

Ну про это уже сотню раз писали http://python.su/forum/topic/24662/?page=2#post-130903



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Янв. 31, 2018 11:38:44

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

Rodegast
> Это само собой разумеется. А как это сделать? Ну про это уже сотню раз писали http://python.su/forum/topic/24662/?page=2#post-130903
Это устаревшая информация по PyQt4, которая не актуальна в PyQt5. Там слоты по-другом сейчас коннектятся, и содержимое библиотек немного поменялось

Офлайн

#7 Янв. 31, 2018 11:47:29

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2832
Репутация: +  186  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

И в чём проблема?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Янв. 31, 2018 12:15:06

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Запуск телеграм бота внутри своего класса

Rodegast
И в чём проблема?
В том, что я не могу интерпретировать строчку

 QtCore.QObject.connect(self.potok, QtCore.SIGNAL("PotokValue(PyQt_PyObject)"), self.labels_output)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version