From 783bc58482dfab90a8a397745618d23466c5d97e Mon Sep 17 00:00:00 2001 From: lsy2246 Date: Wed, 17 Apr 2024 01:01:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=E7=9A=84=E9=80=9A=E4=BF=A1,=E8=BF=98?= =?UTF-8?q?=E6=B2=A1=E8=A7=A3=E5=86=B3=E7=99=BB=E5=BD=95=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=E5=85=B3=E9=97=AD=E9=9D=A2=E6=9D=BF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98,=E6=88=96=E8=AE=B8=E5=8F=AF=E4=BB=A5=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=B8=80=E4=B8=AA=E4=BB=80=E4=B9=88=E4=BD=9C=E4=B8=BA?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E9=9D=A2=E7=89=88=E7=9A=84=E5=91=BD?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- python/test/Client/{ => Page}/Chat_main.py | 0 python/test/Client/{ => Page}/Login.py | 53 +++--- python/test/Client/Page/__init__.py | 2 + .../Client/Process_session/Process_Client.py | 30 +++ .../Client/Process_session/Process_Server.py | 46 +++++ .../test/Client/Process_session/__init__.py | 2 + .../{ => Socket_session}/Session_server.py | 57 +++--- python/test/Client/Socket_session/__init__.py | 1 + python/test/Client/__init__.py | 11 +- python/test/test.py | 172 +++--------------- python/test/test2.py | 67 ++++--- python/test/test_plan.py | 2 +- 12 files changed, 193 insertions(+), 250 deletions(-) rename python/test/Client/{ => Page}/Chat_main.py (100%) rename python/test/Client/{ => Page}/Login.py (91%) create mode 100644 python/test/Client/Page/__init__.py create mode 100644 python/test/Client/Process_session/Process_Client.py create mode 100644 python/test/Client/Process_session/Process_Server.py create mode 100644 python/test/Client/Process_session/__init__.py rename python/test/Client/{ => Socket_session}/Session_server.py (60%) create mode 100644 python/test/Client/Socket_session/__init__.py diff --git a/python/test/Client/Chat_main.py b/python/test/Client/Page/Chat_main.py similarity index 100% rename from python/test/Client/Chat_main.py rename to python/test/Client/Page/Chat_main.py diff --git a/python/test/Client/Login.py b/python/test/Client/Page/Login.py similarity index 91% rename from python/test/Client/Login.py rename to python/test/Client/Page/Login.py index a154259..80429d4 100644 --- a/python/test/Client/Login.py +++ b/python/test/Client/Page/Login.py @@ -1,18 +1,22 @@ import json import multiprocessing +import os + import wx import threading import time +from Client.Process_session.Process_Client import ProcessClient +from .Chat_main import ChatFrame -class LoginFrame(wx.Frame): +class LoginFrame(wx.Frame, ProcessClient): def __init__(self): - wx.Frame.__init__(self, None, id=1001, title='登录', pos=wx.DefaultPosition, size=(380, 300)) - self.queue_in = multiprocessing.Queue() - self.queue_out = multiprocessing.Queue() + wx.Frame.__init__(self, None, id=-1, title='登录', pos=wx.DefaultPosition, size=(380, 300)) + ProcessClient.__init__(self) - self.queue_thread = threading.Thread(target=self.queue_recv) - self.queue_thread.start() + current_file_path = __file__ + current_file_name = os.path.basename(current_file_path).split('.')[0] + self.Process_client_send("Server", "Name", current_file_name) # 创建菜单栏 menu_bar = wx.MenuBar() @@ -99,7 +103,10 @@ class LoginFrame(wx.Frame): if receive_content["genre"] == '登录': match receive_content["data"]: case 0: - # 关闭当前框架 + app = wx.App() + frame = ChatFrame() + frame.Show() + app.MainLoop() self.Close() case -1: wx.MessageBox('重复登录', '登录', wx.OK | wx.ICON_INFORMATION) @@ -112,26 +119,6 @@ class LoginFrame(wx.Frame): f'注册成功\n网名 : {receive_content["data"]['NetName']} \n账号 : {receive_content["data"]['Id']} \n密码 : {receive_content["data"]['Password']}', '注册', wx.OK | wx.ICON_INFORMATION) - def queue_send(self, function, content): - data = json.dumps({"function": function, "content": content}) - self.queue_out.put(data) - - def queue_recv(self): - while True: - try: - data_json = self.queue_in.get() - data = json.loads(data_json) - self.queue_pick(data) - except Exception as e: - print("Error in queue_recv:", e) - - def queue_pick(self, data): - match data["function"]: - case "server_status": - self.server_status = data["content"] - case "login_page_receive": - self.login_page_receive(data["content"]) - def send_login_button(self, event): if self.server_status: account = self.login_panel.LoginPanel_account_text.GetValue().strip() @@ -140,7 +127,7 @@ class LoginFrame(wx.Frame): target = "服务器" genre = "登录" data = {"genre": genre, "target": target, "content": content} - self.queue_send("send_server", data) + self.Process_client_send("Session_server", "send_server", data) def send_register_button(self, event): if self.server_status: @@ -150,7 +137,15 @@ class LoginFrame(wx.Frame): target = "服务器" genre = "注册" data = {"genre": genre, "target": target, "content": content} - self.queue_send("send_server", data) + self.Process_client_send("Session_server", "send_server", data) + + def Process_client_pick(self, data): + if data['target'] in ['ALL', 'Login']: + match data['function']: + case 'server_status': + self.server_status = data['content'] + case 'login_page_receive': + self.login_page_receive(data['content']) class LoginPanel(wx.Panel): diff --git a/python/test/Client/Page/__init__.py b/python/test/Client/Page/__init__.py new file mode 100644 index 0000000..a4f53a0 --- /dev/null +++ b/python/test/Client/Page/__init__.py @@ -0,0 +1,2 @@ +from .Chat_main import * +from .Login import * diff --git a/python/test/Client/Process_session/Process_Client.py b/python/test/Client/Process_session/Process_Client.py new file mode 100644 index 0000000..9376b42 --- /dev/null +++ b/python/test/Client/Process_session/Process_Client.py @@ -0,0 +1,30 @@ +import json +import threading +from multiprocessing.connection import Client + + +class ProcessClient: + def __init__(self): + self.Process_port = 12321 + self.Process_server = 'localhost' + self.Process_client_Client = Client((self.Process_server, self.Process_port)) + Process_client_recv = threading.Thread(target=self.Process_client_recv) + Process_client_recv.start() + + def Process_client_send(self, target, function, content): + data = {"target": target, "function": function, "content": content} + data_json = json.dumps(data) + self.Process_client_Client.send(data_json) + + def Process_client_recv(self): + while True: + try: + data_json = self.Process_client_Client.recv() + data = json.loads(data_json) + self.Process_client_pick(data) + except EOFError: + print("连接已关闭") + break + + def Process_client_pick(self, data): + pass diff --git a/python/test/Client/Process_session/Process_Server.py b/python/test/Client/Process_session/Process_Server.py new file mode 100644 index 0000000..77bb470 --- /dev/null +++ b/python/test/Client/Process_session/Process_Server.py @@ -0,0 +1,46 @@ +import json +import multiprocessing +from multiprocessing.connection import Listener +import threading + + +class ProcessServer: + def __init__(self): + self.Process_port = 12321 + self.Process_server = 'localhost' + self.Process_server_listener = Listener((self.Process_server, self.Process_port)) + self.Process_client_link_dick = {} + Process_client_link_Thread = threading.Thread(target=self.Process_client_link) + Process_client_link_Thread.start() + + def Process_client_link(self): + while True: + client_connect = self.Process_server_listener.accept() + client_Thread_recv = threading.Thread(target=self.Process_client_recv, args=(client_connect,)) + client_Thread_recv.start() + + def Process_client_recv(self, client_Thread_recv): + while True: + data_json = client_Thread_recv.recv() + data = json.loads(data_json) + if data['target'] == 'Server': + if data['function'] == 'Name': + self.Process_client_link_dick[data['content']] = client_Thread_recv + else: + self.Process_client_pick(data) + + def Process_client_send(self, target, function, content): + connect = self.Process_client_link_dick[target] + data = {"target": target, "function": function, "content": content} + data_json = json.dumps(data) + connect.send(data_json) + + def Process_client_pick(self, data): + if data['target'] == 'ALL': + for value in self.Process_client_link_dick.values(): + data_json = json.dumps(data) + value.send(data_json) + else: + if data['target'] in self.Process_client_link_dick.keys(): + data_json = json.dumps(data) + self.Process_client_link_dick[data['target']].send(data_json) diff --git a/python/test/Client/Process_session/__init__.py b/python/test/Client/Process_session/__init__.py new file mode 100644 index 0000000..5690469 --- /dev/null +++ b/python/test/Client/Process_session/__init__.py @@ -0,0 +1,2 @@ +from .Process_Server import * +from .Process_Client import * diff --git a/python/test/Client/Session_server.py b/python/test/Client/Socket_session/Session_server.py similarity index 60% rename from python/test/Client/Session_server.py rename to python/test/Client/Socket_session/Session_server.py index 6ae7683..9dd02c9 100644 --- a/python/test/Client/Session_server.py +++ b/python/test/Client/Socket_session/Session_server.py @@ -1,50 +1,26 @@ import multiprocessing +import os import time import socket import json import threading +from Client.Process_session.Process_Client import ProcessClient -class Session_server: +class Session_server(ProcessClient): def __init__(self): + ProcessClient.__init__(self) self.socker_ip = "127.0.0.1" self.socker_port = 8000 self.server_socket = None self.server_status = False # 服务器状态 - self.queue_in = multiprocessing.Queue() - self.queue_out = multiprocessing.Queue() - - self.queue_thread = threading.Thread(target=self.queue_recv) - self.queue_thread.start() - self.link_server_Thread = threading.Thread(target=self.link_server) self.link_server_Thread.start() - self.receive_server_Thread = threading.Thread(target=self.receive_server) - def queue_send(self, function, content): - data = json.dumps({"function": function, "content": content}) - self.queue_out.put(data) - print(data) - - def queue_recv(self): - while True: - try: - data_json = self.queue_in.get() - data = json.loads(data_json) - self.queue_pick(data) - except Exception as e: - print("Error in queue_recv:", e) - - def queue_pick(self, data): - match data["function"]: - case "server_status": - self.server_status = data["content"] - case "send_server": - genre = data["content"]["genre"] - target = data["content"]["target"] - content = data["content"]["content"] - self.send_server(genre, target, content) + current_file_path = __file__ + current_file_name = os.path.basename(current_file_path).split('.')[0] + self.Process_client_send("Server", "Name", current_file_name) def link_server(self): while True: @@ -62,7 +38,8 @@ class Session_server: self.server_status = False print("连接错误:" + str(a)) finally: - self.queue_send("server_status", self.server_status) + self.Process_client_send("ALL", "server_status", self.server_status) + pass def receive_server(self): while self.server_status: @@ -70,12 +47,11 @@ class Session_server: receive_content_json = self.server_socket.recv(1024).decode('utf-8') receive_content = json.loads(receive_content_json) if receive_content["genre"] in ['注册', '登录']: - self.queue_send("login_page_receive", receive_content) - print(receive_content) + self.Process_client_send("Login", "login_page_receive", receive_content) except Exception as a: print("接收错误:" + str(a)) self.server_status = False - self.queue_send("server_status", self.server_status) + self.Process_client_send("ALL", "server_status", self.server_status) def send_server(self, genre, target, content): if self.server_status: @@ -87,4 +63,13 @@ class Session_server: except Exception as a: print("发送错误:" + str(a)) self.server_status = False - self.queue_send("server_status", self.server_status) + self.Process_client_send("ALL", "server_status", self.server_status) + + def Process_client_pick(self, data): + if data['target'] in ['ALL', 'Session_server']: + match data['function']: + case 'server_status': + self.server_status = data['content'] + print(self.server_status) + case 'send_server': + self.send_server(data['content']['genre'], data['content']['target'], data['content']['content']) diff --git a/python/test/Client/Socket_session/__init__.py b/python/test/Client/Socket_session/__init__.py new file mode 100644 index 0000000..6278850 --- /dev/null +++ b/python/test/Client/Socket_session/__init__.py @@ -0,0 +1 @@ +from .Session_server import * diff --git a/python/test/Client/__init__.py b/python/test/Client/__init__.py index 5325e74..706cb7a 100644 --- a/python/test/Client/__init__.py +++ b/python/test/Client/__init__.py @@ -1,14 +1,15 @@ -from .Login import * -from .Session_server import * -from .Chat_main import * +from .Page import * +from .Socket_session import * +from .Process_session import * class start_all: def __init__(self): + ProcessServer() Session_server() - app = wx.App(False) + app = wx.App() frame = LoginFrame() - frame.Show(True) + frame.Show() app.MainLoop() diff --git a/python/test/test.py b/python/test/test.py index 9b60e15..8e169a5 100644 --- a/python/test/test.py +++ b/python/test/test.py @@ -1,151 +1,37 @@ -import wx -import wx.aui -import wx.lib.scrolledpanel as scrolled -import time +import json +import multiprocessing +from multiprocessing.connection import Listener +import threading -class ChatFrame(wx.Frame): +class ProcessServer: def __init__(self): - super().__init__(None, size=(1000, 700)) + self.Process_port = 12321 + self.Process_server = 'localhost' + self.Process_server_listener = Listener((self.Process_server, self.Process_port)) + self.Process_client_link_dick = {} + Process_client_link_Thread = threading.Thread(target=self.Process_client_link) + Process_client_link_Thread.start() - ChatMain_Panel = wx.Panel(self, style=wx.BORDER_SUNKEN) - ChatMain_box = wx.BoxSizer(wx.HORIZONTAL) - ChatMain_Panel.SetSizer(ChatMain_box) + def Process_client_link(self): + while True: + client_connect = self.Process_server_listener.accept() + print(type(client_connect)) - Function_Panel = wx.Panel(ChatMain_Panel, style=wx.BORDER_RAISED) - Function_box = wx.BoxSizer(wx.VERTICAL) - Function_Panel.SetSizer(Function_box) - Function_Panel.SetBackgroundColour(wx.Colour(242, 242, 242)) + client_process_recv = threading.Thread(target=self.Process_client_recv, args=(client_connect,)) + client_process_recv.start() - image_chat = r'./Client/image/chat.png' - Chat_bitmap = wx.Bitmap(image_chat, wx.BITMAP_TYPE_PNG) - Chat_bitmap_static = wx.StaticBitmap(Function_Panel, bitmap=Chat_bitmap, style=wx.BORDER_RAISED) - Chat_bitmap_static.SetToolTip("聊天") - Function_box.Add(Chat_bitmap_static, 1, wx.EXPAND, 0) - Chat_bitmap_static.Bind(wx.EVT_LEFT_DOWN, self.click_chat_button) + def Process_client_recv(self, client_process_recv): + while True: + data_json = client_process_recv.recv() + data = json.loads(data_json) + print(data) - Function_box.AddSpacer(30) # 调整这个数字以改变间距大小 + def Process_client_send(self, target, function, content): + connect = self.Process_client_link_dick[target] + data = {"target": target, "function": function, "content": content} + data_json = json.dumps(data) + connect.send(data_json) - image_connect = r'./Client/image/connect.png' - connect_bitmap = wx.Bitmap(image_connect, wx.BITMAP_TYPE_PNG) - connect_bitmap_static = wx.StaticBitmap(Function_Panel, bitmap=connect_bitmap, style=wx.BORDER_RAISED) - connect_bitmap_static.SetToolTip("通讯录") - Function_box.Add(connect_bitmap_static, 1, wx.EXPAND, 0) - connect_bitmap_static.Bind(wx.EVT_LEFT_DOWN, self.click_connect_button) - - Function_box.AddSpacer(28) # 调整这个数字以改变间距大小 - - image_find = r'./Client/image/find.png' - find_bitmap = wx.Bitmap(image_find, wx.BITMAP_TYPE_PNG) - find_bitmap_static = wx.StaticBitmap(Function_Panel, bitmap=find_bitmap, style=wx.BORDER_RAISED) - find_bitmap_static.SetToolTip("查找") - Function_box.Add(find_bitmap_static, 1, wx.EXPAND, 0) - find_bitmap_static.Bind(wx.EVT_LEFT_DOWN, self.click_find_button) - - Function_box.AddSpacer(340) # 调整这个数字以改变间距大小 - - image_site = r'./Client/image/site.png' - site_bitmap = wx.Bitmap(image_site, wx.BITMAP_TYPE_PNG) - site_bitmap_static = wx.StaticBitmap(Function_Panel, bitmap=site_bitmap, style=wx.BORDER_RAISED) - site_bitmap_static.SetToolTip("设置") - Function_box.Add(site_bitmap_static, 1, wx.EXPAND, 0) - site_bitmap_static.Bind(wx.EVT_LEFT_DOWN, self.click_site_button) - - Function_box.Fit(Function_Panel) # 调整面板大小以适应图像 - - ChatMain_box.Add(Function_Panel, 0, wx.EXPAND | wx.ALL, 5) - - operate_box = wx.BoxSizer(wx.VERTICAL) - - chat_page = self.ChatPage(ChatMain_Panel) # 将 ChatMain_Panel 作为 ChatPage 的 parent - operate_box.Add(chat_page, 1, wx.EXPAND, 5) - - ChatMain_box.Add(operate_box, 1, wx.EXPAND, 5) - - ChatMain_Panel.SetSizer(ChatMain_box) - - def click_chat_button(self, event): - print("点击了聊天") - - def click_connect_button(self, event): - print("点击了联系人") - - def click_site_button(self, event): - print("点击了设置") - - def click_find_button(self, event): - print("点击了查找") - - class ChatPage(wx.Panel): - def __init__(self, parent): - wx.Panel.__init__(self, parent, style=wx.BORDER_SUNKEN) - ChatPage_main_box = wx.BoxSizer(wx.HORIZONTAL) - self.ChatPage_add_Contact_text_box_dick = {} - - ChatPage_Contact_person_box = wx.BoxSizer(wx.VERTICAL) - self.ChatPage_Contact_person_panel = scrolled.ScrolledPanel(self, -1, style=wx.SUNKEN_BORDER) - self.ChatPage_Contact_person_panel.SetupScrolling() # 启用滚动功能 - self.ChatPage_Contact_person_panel.SetSizer(wx.BoxSizer(wx.VERTICAL)) - ChatPage_Contact_person_box.Add(self.ChatPage_Contact_person_panel, proportion=1, flag=wx.EXPAND | wx.ALL, - border=5) - ChatPage_main_box.Add(ChatPage_Contact_person_box, 1, wx.EXPAND, 5) - - self.ChatPage_add_Contact_person(11, "lsy", "asdasddsa") - - self.chat_tab = wx.aui.AuiNotebook(self,style=wx.aui.AUI_NB_CLOSE_ON_ALL_TABS) - ChatPage_main_box.Add(self.chat_tab, 1, wx.EXPAND, 0) - - self.SetSizer(ChatPage_main_box) - - def ChatPage_add_Contact_person(self, Id, Remark, info): - ChatPage_add_Contact_person_box = wx.BoxSizer(wx.VERTICAL) - - ChatPage_add_Contact_person_top_box = wx.BoxSizer(wx.HORIZONTAL) - if len(Remark) > 6: - Remark = Remark[:6] + "..." - else: - Remark += ''.join([" " for i in range(max(0, 9 - len(Remark)))]) - ChatPage_add_Contact_person_NetName = wx.StaticText(self.ChatPage_Contact_person_panel, -1, Remark) - ChatPage_add_Contact_person_top_box.Add(ChatPage_add_Contact_person_NetName, 0, wx.ALIGN_LEFT, 0) - - ChatPage_add_Contact_person_top_box.AddSpacer(20) - - ChatPage_add_Contact_person_date = wx.StaticText(self.ChatPage_Contact_person_panel, -1, - time.strftime("%Y/%m/%d", time.localtime())) - ChatPage_add_Contact_person_top_box.Add(ChatPage_add_Contact_person_date, 0, wx.ALIGN_CENTER_VERTICAL, 0) - ChatPage_add_Contact_person_box.Add(ChatPage_add_Contact_person_top_box, 0, wx.EXPAND, 0) - - if len(info) > 10: - info = info[:10] + "..." - ChatPage_add_Contact_person_info = wx.StaticText(self.ChatPage_Contact_person_panel, -1, info) - ChatPage_add_Contact_person_box.Add(ChatPage_add_Contact_person_info, 0, wx.ALIGN_LEFT, 0) - - self.ChatPage_Contact_person_panel.GetSizer().Add(ChatPage_add_Contact_person_box, 0, wx.ALL, 5) - self.ChatPage_Contact_person_panel.Layout() - self.ChatPage_Contact_person_panel.SetupScrolling() - - ChatPage_add_Contact_person_NetName.Bind(wx.EVT_LEFT_DOWN, lambda event: self.ChatPage_add_Contact_tab(Id, Remark)) - - - def ChatPage_add_Contact_tab(self, Id, Remark): - for i in range(self.chat_tab.GetPageCount()): - if self.chat_tab.GetPageText(i) == Remark: - return - - chat_panel = wx.Panel(self.chat_tab) - chat_box = wx.BoxSizer(wx.VERTICAL) - - chat_receive_box = wx.BoxSizer(wx.HORIZONTAL) - chat_receive_text = wx.TextCtrl(chat_panel, style=wx.TE_MULTILINE) - chat_receive_box.Add(chat_receive_text, 0, wx.EXPAND, 0) - - chat_box.Add(chat_receive_box, 1, wx.EXPAND, 0) - - self.chat_tab.AddPage(chat_panel, wx.Panel(), Remark, select=True) # 将第三个参数改为 wx.Panel(),表示每个页面使用一个新的 Panel 承载控件 - - chat_panel.SetSizer(chat_box) - -app = wx.App() -frame = ChatFrame() -frame.Show() -app.MainLoop() + def Process_client_pick(self): + pass diff --git a/python/test/test2.py b/python/test/test2.py index 70d5508..c9123ab 100644 --- a/python/test/test2.py +++ b/python/test/test2.py @@ -1,43 +1,38 @@ -# 客户端 -import socket -import cv2 -import pickle -import struct +import json +import threading +from multiprocessing.connection import Client -HOST = '127.0.0.1' # 服务器IP地址 -PORT = 65432 # 连接端口 -# 创建Socket -client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -client_socket.connect((HOST, PORT)) +class ProcessClient: + def __init__(self): + self.Process_port = 12321 + self.Process_server = 'localhost' + self.Process_client_Client = Client((self.Process_server, self.Process_port)) + Process_client_recv = threading.Thread(target=self.Process_client_recv) + print(self.Process_client_Client) + Process_client_recv.start() -# 接收数据 -data = b"" -payload_size = struct.calcsize("Q") -while True: - # 从服务器接收数据 - while len(data) < payload_size: - packet = client_socket.recv(4*10240) - if not packet: break - data += packet - packed_msg_size = data[:payload_size] - data = data[payload_size:] - msg_size = struct.unpack("Q", packed_msg_size)[0] + def Process_client_send(self, target, function, content): + data = {"target": target, "function": function, "content": content} + data_json = json.dumps(data) + self.Process_client_Client.send(data_json) - # 接收视频帧 - while len(data) < msg_size: - data += client_socket.recv(4*1024) - frame_data = data[:msg_size] - data = data[msg_size:] + def Process_client_recv(self): + while True: + try: + data_json = self.Process_client_Client.recv() + data = json.loads(data_json) + print(data) + except EOFError: + print("连接已关闭") + break - # 反序列化视频帧 - frame = pickle.loads(frame_data) + def Process_client_pick(self): + pass - # 显示视频 - cv2.imshow('frame', frame) - if cv2.waitKey(1) == 27: - break -# 释放资源 -client_socket.close() -cv2.destroyAllWindows() +if __name__ == '__main__': + xx = ProcessClient() + while True: + a = input("请输入") + xx.Process_client_send(a, a, a) diff --git a/python/test/test_plan.py b/python/test/test_plan.py index 5a312cd..149f2f8 100644 --- a/python/test/test_plan.py +++ b/python/test/test_plan.py @@ -1,5 +1,5 @@ import wx -from Client.Chat_main import ChatFrame +from Client.Page.Chat_main import ChatFrame if __name__ == '__main__': app = wx.App()