我有一個文本小部件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()
如何捕獲這些列印并將它們放在我的運行功能中的tkinter文本小部件中?main.py它不必捕獲列印,我只需要一種方法在啟動服務器時在我的 Text 小部件上顯示它,并且當它運行時通過 while 回圈顯示之后發生的所有事情。由于能夠創建新服務器并通過存盤為服務器檔案名的名稱運行它們,因此也需要匯入它。
感謝幫助!
uj5u.com熱心網友回復:
我很容易看到完整的代碼,但我認為你可以做類似的事情:
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/456389.html
