在 tkinter 文本小部件中打印服务器输出数据

Printing server output data in tkinter Text widget

我在 tkinter 中有一个文本小部件,我想捕获服务器输出并将其放入其中。

项目文件夹:

project
| main.py
| servers_folder
| | default_server.py

主要是。我正在导入 default_Server.py,它必须是另一个文件,因为我有一个功能可以创建另一个具有一些可变设置的服务器,所以当我想要 运行 服务器时,我按下一个按钮并输入一个服务器(文件)名称并使用 server = importlib.import_module(server_name)

导入

main.py 服务器 运行 函数示例:

def connect(server_name):
    for widget in frame.winfo_children():
        widget.grid_forget()

    def run():
        server = importlib.import_module(server_name)
        server.Server().start()

    command = Text(frame)
    command.grid(row=0, column=0)

    thread = t.Thread(target=run)
    thread.start()


Label(frame, text='Server name:').grid(row=0, column=0)
server_name = Entry(frame)
server_name.grid(row=0, column=1, sticky='NSEW')
Button(frame, text='Run server', command=lambda: connect(server_name.get())).grid(row=1, column=0, columnspan=2)

服务器启动函数:

def start(self):
    print('[STARTING] Server is starting...')
    self.server.listen()
    print(f'[LISTENING] Server is listening on {self.SERVER}')
    while True:
        conn, addr = self.server.accept()
        thread = t.Thread(target=self.handle_client, args=(conn, addr))
        thread.start()

服务器handle_client函数:

def handle_client(self, conn, addr):
    print(f'[NEW CONNECTION] {addr} connected.')
    print(f'[ACTIVE CONNECTIONS] {t.active_count() - 1}')

    connected = True
    while connected:
        msg_lenght = conn.recv(self.HEADER).decode(self.FORMAT)
        if msg_lenght:
            msg_lenght = int(msg_lenght)
            msg = conn.recv(msg_lenght).decode(self.FORMAT)
            if msg == self.DISCONNECT_MESSAGE:
                connected = False

            print(f'[MESSAGE RECIEVED] FROM: {addr}; Message: {msg}')
            conn.send('Message received!'.encode(self.FORMAT))

    conn.close()

我如何捕捉这些照片并将它们放入我的 main.py 运行 函数的 tkinter 文本小部件中?它不必捕获打印件,我只需要一种方法来在启动服务器时将其显示在我的文本小部件上,并且当它 运行 通过 while 循环显示之后发生的所有事情时。还需要导入它,因为它能够创建新服务器,并且 运行 它们的名称存储为服务器的文件名。

感谢您的帮助!

我很容易看到完整的代码,但我认为你可以做类似的事情:

def start(self, msg_callback):
    print('[STARTING] Server is starting...')
    self.msg_callback = msg_callback
    self.server.listen()
    print(f'[LISTENING] Server is listening on {self.SERVER}')
    while True:
        conn, addr = self.server.accept()
        thread = t.Thread(target=self.handle_client, args=(conn, addr))
        thread.start()


def handle_client(self, conn, addr):
    print(f'[NEW CONNECTION] {addr} connected.')
    print(f'[ACTIVE CONNECTIONS] {t.active_count() - 1}')

    connected = True
    while connected:
        msg_lenght = conn.recv(self.HEADER).decode(self.FORMAT)
        if msg_lenght:
            msg_lenght = int(msg_lenght)
            msg = conn.recv(msg_lenght).decode(self.FORMAT)
            self.msg_callback(msg)
            if msg == self.DISCONNECT_MESSAGE:
                connected = False

            print(f'[MESSAGE RECIEVED] FROM: {addr}; Message: {msg}')
            conn.send('Message received!'.encode(self.FORMAT))

    conn.close()


def connect(server_name):
    for widget in frame.winfo_children():
        widget.grid_forget()

    command = Text(frame)
    command.grid(row=0, column=0)
    
    def msg_callback(msg):
        command.delete('1.0', END)
        command.insert('1.0', msg)

    def run():
        server = importlib.import_module(server_name)
        server.Server().start(msg_callback)

    thread = t.Thread(target=run)
    thread.start()


Label(frame, text='Server name:').grid(row=0, column=0)
server_name = Entry(frame)
server_name.grid(row=0, column=1, sticky='NSEW')
Button(frame, text='Run server', command=lambda: connect(server_name.get())).grid(row=1, column=0, columnspan=2)