Привет! Я здесь, чтобы представить вам удивительную поездку в родные приложения с 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 рядами:
GTK. Этикетка
С текстом «Подключение»GTK. Вход
Отказ Установите свой идентификатор в «host_entry»GTK. Кнопка
с идентификатором “connect_btn”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)
Код выше довольно простой:
- Получить адрес сервера
- Создать новый
Сессия
- Init Соединение с
Websocket_connect_Async.
В качестве обратного вызова для функции подключения мы поставь 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://websocket.org/
- https://lazka.github.io/pgi-docs/#Gtk-3.0
- https://lazka.github.io/pgi-docs/#Soup-2.4
Оригинал: “https://dev.to/meamka/python-gtk-and-websocket-kjm”