WebSocket을 Python 및 Gtk와 결합하는 방법 +

여보게, 저기!저는 여기서 여러분께 웹소켓을 사용하는 본 컴퓨터 응용 프로그램의 기묘한 여행을 소개합니다!이러한 상황에서 우리는 다음과 같은 기술을 사용할 것이다.
  • Python
  • GTK+
  • Libsoup
  • Websocket 메시징
  • 로컬 GTK + 채팅 프로그램을 만드는 방법을 알고 싶다면 잠수하세요!

    학설


    WebSockets는 클라이언트와 서버 간에 일치된 연결을 제공하는 프로토콜로 서로 데이터를 전송할 수 있다.이것은 일반적인 HTTP와 달리 인터넷의 전선이나 파이프와 같아서 클라이언트는 서버에만 데이터를 보내고 즉각 응답을 받을 수 있다.
    이런 방법의 장점은 매우 뚜렷하다. 데이터가 다른 클라이언트나 백엔드 어딘가에서 생성될 때 서버는 데이터를 클라이언트에게 전송할 수 있다.클라이언트는 페이지를 새로 고치거나 새로운 데이터를 얻기 위해 일을 할 필요가 없다. 클라이언트는 클라이언트에게 직접 도착하기만 하면 된다.
    WebSocket에 대한 자세한 내용은 를 참조하십시오websocket.org.
    본고에서 웹 소켓 서버에 연결하고 이 기기의 GTK+ 응용 프로그램에서 데이터를 보내거나 수신하는 방법을 보여 드리고 싶습니다.
    나는 GNOME Builder 를 사용하여 초급 운영체제에서 나의 응용 프로그램을 작성할 것이다. 그러나 같은 논리는 GTK+libsoup 사용할 수 있는 어느 곳에나 적용되고 모든 코드는 맥OS에 쉽게 적용될 수 있다.

    사용자 인터페이스


    응용 프로그램의 논리는 매우 간단하지만 대표적이다.사용자 인터페이스는 Gtk.Grid 에 두 개의 스크린을 포함합니다.첫 번째 화면에는 서버 주소의 Gtk.Stack, 연결을 시작하는 단추, 상태를 표시하는 마이크로 모뎀 등 서버에 연결하는 데 필요한 작은 위젯이 포함되어 있습니다.

    두 번째 화면은 더 복잡합니다.그 목적은 메시지를 입력하여 서버에 보내고 Gtk.Entry 서버의 응답을 표시하는 것이다.따라서 우리는 작은 부품을 배치하기 위해 Gtk.TextView 이 필요하다.Gtk.GridGtk.Entry는 우리가 첫 페이지에서 한 것과 같다.로그를 표시하려면 Gtk.ButtonGtk.TextView 에 놓아야 합니다. 창에 포함된 로그보다 훨씬 많은 로그가 나타나지 않도록 스크롤하는 것이 가장 유용합니다.

    연결 페이지


    우리 건설을 시작합시다!Builder에서 Python 3.6+를 사용하여 언어로 새 프로젝트를 만듭니다.

    IDE는 필요한 모든 기본 응용 프로그램 구조를 포함하고 두 개의 파일만 필요로 합니다: Gtk.ScrolledWindowwindow.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
    문서:
  • https://websocket.org/
  • https://lazka.github.io/pgi-docs/#Gtk-3.0
  • https://lazka.github.io/pgi-docs/#Soup-2.4
  • 좋은 웹페이지 즐겨찾기