在 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)
我在 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)