WebSocket을 Python 및 Gtk와 결합하는 방법 +
학설
WebSockets는 클라이언트와 서버 간에 일치된 연결을 제공하는 프로토콜로 서로 데이터를 전송할 수 있다.이것은 일반적인 HTTP와 달리 인터넷의 전선이나 파이프와 같아서 클라이언트는 서버에만 데이터를 보내고 즉각 응답을 받을 수 있다.
이런 방법의 장점은 매우 뚜렷하다. 데이터가 다른 클라이언트나 백엔드 어딘가에서 생성될 때 서버는 데이터를 클라이언트에게 전송할 수 있다.클라이언트는 페이지를 새로 고치거나 새로운 데이터를 얻기 위해 일을 할 필요가 없다. 클라이언트는 클라이언트에게 직접 도착하기만 하면 된다.
WebSocket에 대한 자세한 내용은 를 참조하십시오websocket.org.
본고에서 웹 소켓 서버에 연결하고 이 기기의 GTK+ 응용 프로그램에서 데이터를 보내거나 수신하는 방법을 보여 드리고 싶습니다.
나는 GNOME Builder 를 사용하여 초급 운영체제에서 나의 응용 프로그램을 작성할 것이다. 그러나 같은 논리는 GTK+ 및 libsoup 사용할 수 있는 어느 곳에나 적용되고 모든 코드는 맥OS에 쉽게 적용될 수 있다.
사용자 인터페이스
응용 프로그램의 논리는 매우 간단하지만 대표적이다.사용자 인터페이스는
Gtk.Grid
에 두 개의 스크린을 포함합니다.첫 번째 화면에는 서버 주소의 Gtk.Stack
, 연결을 시작하는 단추, 상태를 표시하는 마이크로 모뎀 등 서버에 연결하는 데 필요한 작은 위젯이 포함되어 있습니다.두 번째 화면은 더 복잡합니다.그 목적은 메시지를 입력하여 서버에 보내고
Gtk.Entry
서버의 응답을 표시하는 것이다.따라서 우리는 작은 부품을 배치하기 위해 Gtk.TextView
이 필요하다.Gtk.Grid
과Gtk.Entry
는 우리가 첫 페이지에서 한 것과 같다.로그를 표시하려면 Gtk.Button
를 Gtk.TextView
에 놓아야 합니다. 창에 포함된 로그보다 훨씬 많은 로그가 나타나지 않도록 스크롤하는 것이 가장 유용합니다.연결 페이지
우리 건설을 시작합시다!Builder에서 Python 3.6+를 사용하여 언어로 새 프로젝트를 만듭니다.
IDE는 필요한 모든 기본 응용 프로그램 구조를 포함하고 두 개의 파일만 필요로 합니다:
Gtk.ScrolledWindow
및window.ui
.우선, 우리는 정확한 응용 프로그램 인터페이스가 필요하기 때문에
window.py
을 엽니다."Hello World"window.ui
를 압축하여 Label
로 교체합니다.우리는 두 페이지가 필요하다.첫 번째 화면을 "connection"으로 명명하고 세 줄과 세 열로 배치합니다
Gtk.Stack
.중앙 단원 위치Gtk.Grid
에서 네 줄:Gtk.Box
텍스트 연결 포함 Gtk.Label
. id를 "host_entry"Gtk.Entry
, id는 "connect\ubtn"Gtk.Button
. 네가 어떻게 말하든지 간에 나의 것은 단지 회전기일 뿐이다. 채팅 페이지
한층 더 나아가다.두 번째 화면은 좀 복잡합니다.마찬가지로 우리는
Gtk.Spinner
우리가 필요로 하는 모든 작은 부품을 배치해야 한다.그러나 이제 2행 2열만 있는 메쉬가 됩니다.첫 번째 줄의 셀에는 두 개의 작은 위젯이 있습니다.
Gtk.Grid
, id는 "message_entry"Gtk.Entry
, id는 "send\u btn"Gtk.Button
에서는 id가 필요하지 않습니다. 왜냐하면 우리는 그것을 호출할 방법이 필요하지 않기 때문입니다.이 스크롤 창에 새 Gtk.ScrolledWindow
작은 위젯이 설치되어 있습니다.id를 "log\uview"로 설정합니다.편리해 보이려면 Scrolled Window의 속성 편집기에 있는 용기 도구에width=2를 설정하십시오.
사고방식
예. UI는 논리적으로 구성할 준비가 되어 있습니다. 마지막으로:)
Gtk.TextView
를 열고 클래스 변수를 추가하여 window.py
파일의 작은 위젯을 연결합니다.# 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\u 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)
위의 코드는 매우 간단합니다..ui
Session
연결 초기화websocket_connect_async
방법을 제시했는데 이 방법은 이 조작의 결과를 얻고 이 과정을 완성했다.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()
우리는 거의 완성했다!우리가 해야 할 일은 "send\ubtn"에서 온 클릭 이벤트를 처리하고 "log\uview"에 메시지를 표시하는 것입니다.def on_message(self, connection, msg_type, message):
msg = f'<b>RECEIVED:</b> {message.get_data().decode()}\n'
self.buffer.insert_markup(self.buffer.get_start_iter(),
msg,
len(msg))
이보다 더 간단할 수 있을까요?😉 더 읽을 수 있는 방식으로 메시지를 표시하기 위해 Pango 태그를 추가하고 on_connection
의 insert_markup
방법을 사용합니다...태그 삽입!마지막으로, 그러나 가장 필요하지 않은 것은 "send\ubtn"신호의 처리 프로그램은 아니다.
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)
우리의 간단한 예에 대해 우리는 Gtk.TextBuffer
방법만 필요로 한다.그러나libsoup은 여러 가지 다른 일을 할 수 있다. 예를 들어 send_text
, 또는 어떤 일goes wrong에 신호를 보낼 수 있다.결론
간단하지만 묘사적인 예는 웹 소켓이 내장된 GTK+ 응용 프로그램을 구축하는 방법을 소개한다.아마도 당신은 새로운 채팅 프로그램을 만들 수 있습니까?
만약 당신이 더 많은 책을 읽고 싶다면, 계속 관심을 가져 주십시오!또는 링크 섹션에서 문서로 이동합니다.
어쨌든 행운을 빌어요!
링크
소스 코드:
https://github.com/amka/pygobject-gtk-websocket-app
문서:
Reference
이 문제에 관하여(WebSocket을 Python 및 Gtk와 결합하는 방법 +), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/meamka/python-gtk-and-websocket-kjm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)