import wx.richtext as rt import os import wx import time import multiprocessing from Client.Transmission.Process_Client import ProcessClient class ChatFrame(wx.Frame, ProcessClient): def __init__(self, Id): wx.Frame.__init__(self, None, size=(800, 600), title="账号: " + str(Id)) ProcessClient.__init__(self) self.userid = Id current_file_path = __file__ current_file_name = os.path.basename(current_file_path).split('.')[0] self.Process_client_send("Server", "Name", current_file_name) ChatMain_Panel = wx.Panel(self, style=wx.BORDER_SUNKEN) ChatMain_box = wx.BoxSizer(wx.HORIZONTAL) ChatMain_Panel.SetSizer(ChatMain_box) 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(240, 240, 240)) 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) Function_box.AddSpacer(20) # 调整这个数字以改变间距大小 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(20) # 调整这个数字以改变间距大小 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(280) # 调整这个数字以改变间距大小 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) self.chat_page = self.ChatPage(ChatMain_Panel) # 将 ChatMain_Panel 作为 ChatPage 的 parent operate_box.Add(self.chat_page, 1, wx.EXPAND, 5) self.chat_page.Hide() self.Process_client_send("File_operate", "read_data", None) self.connect_page = self.ConnectPage(ChatMain_Panel) operate_box.Add(self.connect_page, 1, wx.EXPAND, 5) self.connect_page.Hide() self.site_page = self.SitePage(ChatMain_Panel) operate_box.Add(self.site_page, 1, wx.EXPAND, 5) self.site_page.Hide() self.find_page = self.FindPage(ChatMain_Panel) operate_box.Add(self.find_page, 1, wx.EXPAND, 5) self.find_page.Hide() ChatMain_box.Add(operate_box, 1, wx.EXPAND, 5) self.chat_page.Show() ChatMain_Panel.SetSizer(ChatMain_box) def click_chat_button(self, event): self.chat_page.Hide() self.connect_page.Hide() self.site_page.Hide() self.find_page.Hide() self.chat_page.Show() self.Layout() def click_connect_button(self, event): self.chat_page.Hide() self.connect_page.Hide() self.site_page.Hide() self.find_page.Hide() self.connect_page.Show() self.Layout() def click_site_button(self, event): self.chat_page.Hide() self.connect_page.Hide() self.site_page.Hide() self.find_page.Hide() self.site_page.Show() self.Layout() def click_find_button(self, event): self.chat_page.Hide() self.connect_page.Hide() self.site_page.Hide() self.find_page.Hide() self.find_page.Show() self.Layout() def Process_client_pick(self, data): if data['target'] in ['ALL', 'Chat_main']: match data['function']: case 'ChatPage_add_Contact_person': data = data['content'] Contact = data['Contact'] Remark = data['Remark'] Time = data['UpDataTime'] wx.CallAfter(self.chat_page.ChatPage_add_Contact_person, Contact, Remark) case 'Chat_screen_show': Contact = None data = data['content'] send = data['Send'] receive = data['Receive'] Type = data['Type'] content = data['Content'] UpDataTime = data['Time'] if send == str(self.userid): Contact = receive elif receive == str(self.userid): Contact = send wx.CallAfter(self.chat_page.Chat_screen_show, Contact, send, receive, Type, content, UpDataTime) 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.chat_page_map = {} self.chat_page_ids = [] self.current_chat_page = None # 新增的属性用于跟踪当前显示的聊天面板 self.ChatPage_Listbook = wx.Listbook(self, style=wx.LB_LEFT) self.ChatPage_Listbook.Bind(wx.EVT_LISTBOOK_PAGE_CHANGED, self.on_page_changed) ChatPage_main_box.Add(self.ChatPage_Listbook, 1, wx.EXPAND, 0) self.SetSizer(ChatPage_main_box) def ChatPage_add_Contact_person(self, Id, Remark): contact_page = wx.Panel(self.ChatPage_Listbook) self.ChatPage_Listbook.AddPage(contact_page, Remark) chat_page = self.ChatPage_add_Contact_tab(Id) self.chat_page_map[Id] = chat_page self.chat_page_ids.append(Id) # 隐藏当前的聊天面板 if self.current_chat_page: self.current_chat_page.Hide() # 将新的聊天面板添加到ChatPage_main_box中 self.GetSizer().Add(chat_page, 5, wx.EXPAND) # 显示新的聊天面板 chat_page.Show() # 更新当前显示的聊天面板 self.current_chat_page = chat_page chat_page.Show() # 重新布局 self.Layout() def ChatPage_add_Contact_tab(self, Id): chat_panel = wx.Panel(self) chat_box = wx.BoxSizer(wx.VERTICAL) chat_panel.contact_id = Id chat_receive_box = wx.BoxSizer(wx.HORIZONTAL) chat_panel.chat_receive_text = rt.RichTextCtrl(chat_panel, style=wx.VSCROLL | wx.HSCROLL | wx.NO_BORDER | wx.WANTS_CHARS) chat_receive_box.Add(chat_panel.chat_receive_text, 1, wx.EXPAND, 0) chat_box.Add(chat_receive_box, 2, wx.EXPAND, 0) toolbar = wx.ToolBar(chat_panel) toolbar.SetToolBitmapSize((16, 16)) # Set the size of the toolbar icons toolbar.AddTool(wx.ID_ANY, "Tool", wx.Bitmap(wx.Bitmap(r'./Client/image/picture.png'))) toolbar.AddTool(wx.ID_ANY, "Tool", wx.Bitmap(wx.Bitmap(r'./Client/image/file.png'))) toolbar.AddTool(wx.ID_ANY, "Tool", wx.Bitmap(wx.Bitmap(r'./Client/image/speech.png'))) toolbar.AddTool(wx.ID_ANY, "Tool", wx.Bitmap(wx.Bitmap(r'./Client/image/video.png'))) toolbar.Realize() toolbar.SetSize((-1, 30)) # Set the size of the toolbar chat_box.Add(toolbar, 0, wx.EXPAND) chat_send_box = wx.BoxSizer(wx.HORIZONTAL) chat_panel.chat_send_text = wx.TextCtrl(chat_panel, style=wx.TE_MULTILINE) chat_send_box.Add(chat_panel.chat_send_text, 1, wx.EXPAND, 0) chat_box.Add(chat_send_box, 1, wx.EXPAND, 0) send_button = wx.Button(chat_panel, label='发送') # Create a send button send_button.Bind(wx.EVT_BUTTON, self.on_send_button_click) chat_send_box.Add(send_button, 0, wx.EXPAND | wx.LEFT, 5) # Add the button to the send box chat_panel.SetSizer(chat_box) return chat_panel def Chat_screen_show(self, Contact, send, receive, Type, data, UpDataTime): chat_panel = self.chat_page_map[Contact] if Type == 'text': # 确定对齐方式 if Contact == receive: alignment = wx.TEXT_ALIGNMENT_RIGHT else: alignment = wx.TEXT_ALIGNMENT_LEFT # 开始设置对齐 chat_panel.chat_receive_text.BeginAlignment(alignment) # 按每30个字符分割消息内容并写入 contents = [data[i:i + 30] for i in range(0, len(data), 30)] contents.append(UpDataTime) # 添加时间戳 for content in contents: chat_panel.chat_receive_text.WriteText(content + '\n') # WriteText处理换行 # 结束对齐设置 chat_panel.chat_receive_text.EndAlignment() # 添加额外的新行(如果需要) chat_panel.chat_receive_text.Newline() # 在添加完所有消息后 chat_panel.chat_receive_text.ShowPosition(chat_panel.chat_receive_text.GetLastPosition()) chat_panel.Refresh() chat_panel.Update() self.Layout() def on_send_button_click(self, event): button = event.GetEventObject() chat_panel = button.GetParent() send_text = chat_panel.chat_send_text.GetValue() # 正确获取输入框内容 contact_id = str(chat_panel.contact_id) # 获取联系人ID if send_text == '': return self.Chat_screen_show(contact_id, None, contact_id, 'text', send_text, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) data = {"Type": "text", "content": send_text} content = {"genre": '聊天记录', "target": contact_id, "content": data} top_frame = self.GetTopLevelParent() top_frame.Process_client_send('Session_server', 'send_server', content) chat_panel.chat_send_text.SetValue('') # 清空输入框 event.Skip() def on_page_changed(self, event): # 获取当前选定的页面的索引 current_page_index = self.ChatPage_Listbook.GetSelection() # 通过索引从chat_page_ids列表中获取对应的Id current_page_id = self.chat_page_ids[current_page_index] # 从chat_page_map中找到对应的聊天面板 new_chat_page = self.chat_page_map[current_page_id] # 隐藏旧的聊天面板 if self.current_chat_page: self.current_chat_page.Hide() # 显示新的聊天面板 new_chat_page.Show() # 更新当前显示的聊天面板 self.current_chat_page = new_chat_page # 重新布局 self.Layout() # 处理完事件后,不要忘记调用event.Skip(),以便事件可以继续传播到其他处理器 event.Skip() class ConnectPage(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) print("联系人") class SitePage(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) print("设置") class FindPage(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) print("查找")