Рубрики
Без рубрики

Как использовать WebSockets с Python и GTK +

Привет! Я здесь, чтобы представить вам удивительную поездку в родные приложения с WebSockets! В этой Curren … Помечено Python, GTK, Websocket, Учебник.

Привет! Я здесь, чтобы представить вам удивительную поездку в родные приложения с WebSockets! В этом текущем случае мы будем использовать эти технологии:

  • Питон
  • GTK +
  • Libsoup
  • Обмен сообщениями Websocket

Если вам интересно, как построить собственное приложение GTK + чат, давайте погрузимся со мной!

Теория

WebSockets это протокол, предназначенный для обеспечения последовательного соединения между клиентом и сервером, где оба могут отправлять данные друг другу. Это похоже на провод через Интернет или трубку, отличный от обычного http, где клиент может отправлять данные только на сервер, и он немедленно получает ответ.

Преимущества этого подхода совершенно очевидны: сервер может подтолкнуть данные клиенту, когда речь идет о сервере от другого клиента или сгенерировано где-то на бэкэнде. И клиент не нужно обновлять страницу или сделать что-то, чтобы получить новые данные, это просто приходит к клиенту самостоятельно.

Больше информации о WebSockets Вы можете найти на Websocket.org Отказ

То, что я хочу показать вам в этой статье, именно то, как подключиться к серверу WebSocket и отправлять или получать данные из него в наборных приложении GTK +.

Я буду кодировать мое приложение в элементарной ОС, используя Gnome Builder , но та же логика должна работать где угодно, где GTK + и libsoup Доступны, и весь код может быть легко адаптирован даже для MacOS.

Ui

Логика приложения довольно простой, но представитель. УИ будет состоять из двух экранов ( GTK. Сетка ) размещены в GTK. Стек Отказ Первый экран содержит виджеты, необходимые для подключения к серверу, например GTK. Вход Для адреса сервера кнопка для инициирования соединения и спиннера для отображения состояния.

Второй экран более сложный. Целью этого является войти в сообщение, отправьте его на сервер и показать ответ сервера в GTK. TextView. . Таким образом, нам нужно GTK. Сетка размещать виджеты. GTK. Вход и GTK. Кнопка Так же, как мы сделали это на первой странице. И отображать журнал нам нужен GTK. TextView размещены в … GTK. ScrolledWindow Если будет гораздо больше журналов, чем окно может содержать окна, и прокрутка будет столь же полезной особенностью, как оно может:)

Страница подключения

Давайте начнем строить! Создайте новый проект в Builder, как язык, мы будем использовать Python 3.6+.

IDE будет генерировать структуру приложения Base со всеми, что нам нужно, и все, что нам нужно, это только два файла: window.ui и window.py Отказ

Во-первых, нам нужен правильный интерфейс для нашего приложения, так что открыть window.ui Отказ Файл и замените «Hello World» Этикетка с GTK. Стек Отказ Нам понадобится две страницы.

Назовите первый экран «Подключение» и поместите его на него GTK. Сетка с 3 рядами и колоннами. В центральной камере место GTK. Коробка с 4 рядами:

  1. GTK. Этикетка С текстом «Подключение»
  2. GTK. Вход Отказ Установите свой идентификатор в «host_entry»
  3. GTK. Кнопка с идентификатором “connect_btn”
  4. GTK. Спиннер Отказ Позвоните ему, что вам нравится, мой просто «спиннер»:)

Этого достаточно для страницы «подключения».

Чат страницы

Двигаться дальше. Второй экран немного сложнее. Опять же, нам нужно GTK. Сетка Чтобы поставить все виджеты, которые нам нужны. Но на данный момент это будет сетка с 2 рядами и 2 колоннами.

Первый ряд с двумя виджетами в собственных клетках:

  • GTK. Вход с идентификатором “message_entry”
  • GTK. Кнопка с ID “send_btn”

На втором ряду место GTK. ScrolledWindow Ни один идентификатор не требуется, потому что нам не нужно вызывать его метод. Внутри этого ScrolledWindow поставил новый GTK. TextView виджет. Установите свой ID на «log_View».

Чтобы сделать это удобнее, набор ширина В реквизитах контейнера внутри редактора атрибута для ScrolledWindow.

Логика

Хорошо, UI UI достаточно готовы, чтобы построить какую-то логику для него, наконец:)

Открыть window.py и добавить класс vars для подключения с виджетами из .ui файл.

# Stack with pages
screens = Gtk.Template.Child()

# Connection page widgets
host_entry = Gtk.Template.Child()
connect_btn = Gtk.Template.Child()
disconnect_btn = Gtk.Template.Child()
spinner = Gtk.Template.Child()

# Chat page widgets
send_btn = Gtk.Template.Child()
message_entry = Gtk.Template.Child()
log_view = Gtk.Template.Child()

# Declare some class-vars
self.session = None
self.connection = None

Ну, теперь мы можем вызвать методы этих виджетов. Но также мы должны обрабатывать свои сигналы. Давайте подключите «Connect_BTN»:

def __init__(self, **kwargs):
    # Some app logic

    self.connect_btn.connect('clicked', self.on_connect_clicked)

def on_connect_clicked(self, widget):
    # Check if there is a text inside the host_entry
    # and grab focus if its empty
    if not self.host_entry.get_text():
        self.host_entry.grab_focus()
        return

    # Show user we are trying to connect
    self.spinner.start()

    # Init libsoup Session, create message and start connection
    self.session = Soup.Session()
    msg = Soup.Message.new("GET", self.host_entry.get_text())
    self.session.websocket_connect_async(msg, None, None, None, self.on_connection)

Код выше довольно простой:

В качестве обратного вызова для функции подключения мы поставь on_connection Способ, который принимает результат этой операции и завершит процесс.

def on_connection(self, session, result):
    try:
        # Finish connection process
        self.connection = session.websocket_connect_finish(result)

        # If we here, the connection went correctly
        # Connect `message` handler to the connection
        self.connection.connect('message', self.on_message)

        # Show to user all is OK and switch to the Chat page
        self.screens.set_visible_child_name('chat')
        self.disconnect_btn.set_visible(True)

    except Exception as e:
        # In case something goes wrong just print an exception
        print(e)
        self.session = None

    finally:
        # Don't forget to show a user that process is finished.
        self.spinner.stop()

Мы почти закончили! Все, что нам нужно сделать больше, – это обработать событие CLICK из сообщения «Send_BTN» и отображения в «Log_View».

def on_message(self, connection, msg_type, message):
    msg = f'RECEIVED: {message.get_data().decode()}\n'
    self.buffer.insert_markup(self.buffer.get_start_iter(),
                              msg,
                              len(msg))

Это было бы проще, чем это? 😉 Просто чтобы отобразить сообщение более читабельным образом, мы добавляем разметку Pango и использовать insert_markup метод GTK. TextBuffer Чтобы … Вставьте разметку!

Последнее, но не менее важное значение – это обработчик для сигнала «send_BTN».

def on_send_clicked(self, widget):
    # Get the message from the Entry
    msg = self.message_entry.get_text()

    # If there is no message - grab focus.
    if not msg:
        self.message_entry.grab_focus()
        return

    # Send a text to the server.
    self.connection.send_text(msg)

Для нашего простого случая все, что нам нужно, это просто send_text метод. Но LibSoup может сделать много разных вещей, таких как send_binary или излучает сигнал, если что-то Идет не так Отказ

Заключение

Простой, но описательный пример того, как начать создание приложения GTK + с WebSockets внутри. Может быть, вы создадите новое приложение для чата?

Оставайтесь настроенными, если вы хотите прочитать больше! Или перейдите к документам из раздела ссылок.

Во всяком случае, удачи!

Ссылки

Исходный код: https://github.com/amka/pygobject-gtk-websocket-app.

Документы:

Оригинал: “https://dev.to/meamka/python-gtk-and-websocket-kjm”