diff --git a/python/test/Cilent/Login.py b/python/test/Cilent/Login.py index 1544ea4..f42ec33 100644 --- a/python/test/Cilent/Login.py +++ b/python/test/Cilent/Login.py @@ -1,10 +1,12 @@ import wx import threading +import time +from tkinter import messagebox class LoginFrame(wx.Frame): def __init__(self): - wx.Frame.__init__(self, None, id=1001, title='登录', pos=wx.DefaultPosition, size=(400, 300)) + wx.Frame.__init__(self, None, id=1001, title='登录', pos=wx.DefaultPosition, size=(380, 300)) # 创建菜单栏 menu_bar = wx.MenuBar() @@ -16,30 +18,42 @@ class LoginFrame(wx.Frame): # 更多菜单 more_menu = wx.Menu() self.register_id = wx.NewId() - self.retrieve_id = wx.NewId() self.set_server_id = wx.NewId() more_menu.Append(self.register_id, "注册账号") - more_menu.Append(self.retrieve_id, "找回密码") more_menu.Append(self.set_server_id, "服务器设置") menu_bar.Append(more_menu, "更多") self.SetMenuBar(menu_bar) # 创建状态栏 - self.status_bar = self.CreateStatusBar(4) - self.status_bar.SetStatusText("服务器连接:", 0) - self.status_bar.SetStatusText("状态:", 2) + self.status_bar = self.CreateStatusBar(2) + self.server_status = False # 服务器状态 + status_thread = threading.Thread(target=self.update_status_bar(None)) + status_thread.daemon = True + status_thread.start() + + # 启动定时器,每秒钟触发一次 + self.timer = wx.Timer(self) + self.Bind(wx.EVT_TIMER, self.update_status_bar, self.timer) + self.timer.Start(1000) # 设置定时器间隔为1000毫秒(1秒 # 获取菜单点击事件 self.Bind(wx.EVT_MENU, self.click_menu, id=self.register_id) - self.Bind(wx.EVT_MENU, self.click_menu, id=self.retrieve_id) self.Bind(wx.EVT_MENU, self.click_menu, id=self.set_server_id) self.Bind(wx.EVT_MENU_OPEN, self.click_menu_title) # 创建注册面板 - self.panel = RegisterPanel(self) + self.panel = LoginPanel(self) self.panel.Show() + def update_status_bar(self, event): + if self.server_status: + self.status_bar.SetStatusText("服务器\t已连接", 0) + else: + self.status_bar.SetStatusText("服务器\t未连接", 0) + + self.status_bar.SetStatusText("时间\t" + time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), 1) + def click_menu_title(self, event): menu = event.GetMenu() menu_title = menu.GetTitle() @@ -49,8 +63,6 @@ class LoginFrame(wx.Frame): self.panel.Show() self.Layout() - - # 点击菜单检测 def click_menu(self, event): menu_id = event.GetId() @@ -59,11 +71,6 @@ class LoginFrame(wx.Frame): self.panel = RegisterPanel(self) self.panel.Show() self.Layout() - elif menu_id == self.retrieve_id: - self.panel.Destroy() - self.panel = LoginPanel(self) - self.panel.Show() - self.Layout() elif menu_id == self.set_server_id: self.panel.Destroy() self.panel = LoginPanel(self) @@ -79,7 +86,7 @@ class LoginPanel(wx.Panel): # 顶部盒子,目前只放了软件名 top_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子 - show_title = wx.StaticText(self, label='Lsy chat') + show_title = wx.StaticText(self, label='登录') show_title.SetFont(wx.Font(30, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) top_box.Add(show_title, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) main_box.Add(top_box, 0, wx.EXPAND) @@ -91,9 +98,9 @@ class LoginPanel(wx.Panel): account_label = wx.StaticText(self, label=' 账号:') account_label.SetFont(wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) account_box.Add(account_label, 0, wx.ALIGN_CENTER_VERTICAL) - account_text = wx.TextCtrl(self, size=(300, 30)) - account_text.SetHint('请输入账号') - account_box.Add(account_text, 1, wx.ALIGN_CENTER_VERTICAL) + self.account_text = wx.TextCtrl(self, size=(300, 30)) + self.account_text.SetHint('请输入账号') + account_box.Add(self.account_text, 1, wx.ALIGN_CENTER_VERTICAL) content_box.Add(account_box) # 添加空白控件来增加间距 content_box.Add(wx.StaticText(self, label=''), 0, wx.ALL, 5) @@ -102,9 +109,9 @@ class LoginPanel(wx.Panel): password_label = wx.StaticText(self, label=' 密码:') password_label.SetFont(wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) password_box.Add(password_label, 0, wx.ALIGN_CENTER_VERTICAL) - password_text = wx.TextCtrl(self, size=(300, 30)) - password_text.SetHint('请输入密码') - password_box.Add(password_text, 1, wx.ALIGN_CENTER_VERTICAL) + self.password_text = wx.TextCtrl(self, size=(300, 30)) + self.password_text.SetHint('请输入密码') + password_box.Add(self.password_text, 1, wx.ALIGN_CENTER_VERTICAL) content_box.Add(password_box) main_box.Add(content_box, 0, wx.EXPAND) @@ -122,33 +129,56 @@ class LoginPanel(wx.Panel): self.SetSizer(main_box) + + class RegisterPanel(wx.Panel): def __init__(self, parent): super().__init__(parent) + # 主盒子 main_box = wx.BoxSizer(wx.VERTICAL) - # 内容盒子,放账号和密码 + + # 顶部盒子,目前只放了软件名 + top_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子 + show_title = wx.StaticText(self, label='注册') + show_title.SetFont(wx.Font(30, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + top_box.Add(show_title, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10) + main_box.Add(top_box, 0, wx.EXPAND) + + # 中部盒子,放账号和密码 content_box = wx.BoxSizer(wx.VERTICAL) # 账号 account_box = wx.BoxSizer(wx.HORIZONTAL) - account_label = wx.StaticText(self, label=' 账号:') + account_label = wx.StaticText(self, label=' 用户名:') account_label.SetFont(wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) account_box.Add(account_label, 0, wx.ALIGN_CENTER_VERTICAL) - account_text = wx.TextCtrl(self, size=(300, 30)) - account_text.SetHint('请输入账号') - account_box.Add(account_text, 1, wx.ALIGN_CENTER_VERTICAL) + self.account_text = wx.TextCtrl(self, size=(300, 30)) + self.account_text.SetHint('请输入用户名') + account_box.Add(self.account_text, 1, wx.ALIGN_CENTER_VERTICAL) content_box.Add(account_box) # 添加空白控件来增加间距 content_box.Add(wx.StaticText(self, label=''), 0, wx.ALL, 5) # 密码 password_box = wx.BoxSizer(wx.HORIZONTAL) - password_label = wx.StaticText(self, label=' 密码:') + password_label = wx.StaticText(self, label=' 密码: ') password_label.SetFont(wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) password_box.Add(password_label, 0, wx.ALIGN_CENTER_VERTICAL) - password_text = wx.TextCtrl(self, size=(300, 30)) - password_text.SetHint('请输入密码') - password_box.Add(password_text, 1, wx.ALIGN_CENTER_VERTICAL) + self.password_text = wx.TextCtrl(self, size=(300, 30)) + self.password_text.SetHint('请输入密码') + password_box.Add(self.password_text, 1, wx.ALIGN_CENTER_VERTICAL) content_box.Add(password_box) main_box.Add(content_box, 0, wx.EXPAND) + # 底部盒子 + bottom_box = wx.BoxSizer(wx.VERTICAL) + # 登录按钮 + register_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子布局 + login_label = wx.Button(self, size=(200, 50), label='确认') + register_box.AddStretchSpacer() # 添加一个可伸缩的空间,将登录按钮推到垂直中间 + register_box.Add(login_label, 0, wx.ALIGN_CENTER_HORIZONTAL) # 将登录按钮添加到垂直盒子中 + register_box.AddStretchSpacer() # 再次添加一个可伸缩的空间,将登录按钮推到垂直中间 + bottom_box.Add(register_box, 1, + wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL) # 将垂直盒子添加到底部盒子中,设置垂直和水平居中对齐 + main_box.Add(bottom_box, 1, wx.EXPAND) # 将底部盒子添加到主盒子中,使其填满剩余空间 + self.SetSizer(main_box) diff --git a/python/test/Cilent/Session_server.py b/python/test/Cilent/Session_server.py new file mode 100644 index 0000000..11ba85a --- /dev/null +++ b/python/test/Cilent/Session_server.py @@ -0,0 +1,47 @@ +import string +import time +import socket +from threading import Thread +import random +import json + + +class Session_server: + def __init__(self, ip_socker, port_socker): + self.ip_socker = ip_socker + self.port_socker = port_socker + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.server_status = False # 服务器状态 + + def Link_server(self): + Verification_code = "" + for _ in range(20): + if random.choice([True, False]): + Verification_code += str(random.randint(0, 9)) + else: + Verification_code += random.choice(string.ascii_letters) + data = {"genre": "test", "source": "Link_server", "data": Verification_code, + "datetime": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} + data_json = json.dumps(data) + self.server_socket.sendto(data_json.encode("utf-8"), (self.ip_socker, self.port_socker)) + receive_content_json = self.server_socket.recv(1024).decode('utf-8') + receive_content = json.loads(receive_content_json) + if receive_content["data"] == Verification_code: + self.server_status = True # 服务器状态 + Receive_server_Thread = Thread(target=self.Receive_server) + Receive_server_Thread.daemon = True + Receive_server_Thread.start() + + + def Receive_server(self): + while self.server_status: + receive_content_json = self.server_socket.recv(1024).decode('utf-8') # 追加接收到的数据 + receive_content = json.loads(receive_content_json) + print(receive_content) + + def Send_server(self, genre, source, content): + if self.server_status: + data = {"genre": genre, "source": source, "data": content, + "datetime": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())} + data_json = json.dumps(data) + self.server_socket.sendto(data_json.encode("utf-8"), (self.ip_socker, self.port_socker)) diff --git a/python/test/Cilent/__init__.py b/python/test/Cilent/__init__.py index 28334c2..ec0fe5b 100644 --- a/python/test/Cilent/__init__.py +++ b/python/test/Cilent/__init__.py @@ -1 +1,15 @@ from .Login import * +from .Session_server import * + + +class Client_main(LoginFrame, Session_server): + def __init__(self, ip_socker, port_socker): + Session_server.__init__(self, ip_socker, port_socker) + LoginFrame.__init__(self) + Session_server.Link_server(self) + + # 主页按键绑定 + + def Sign_Account(self, event): + if self.GetParent().server_status: + pass diff --git a/python/test/Cilent/__pycache__/Login.cpython-312.pyc b/python/test/Cilent/__pycache__/Login.cpython-312.pyc index 27b0ee7..b925acc 100644 Binary files a/python/test/Cilent/__pycache__/Login.cpython-312.pyc and b/python/test/Cilent/__pycache__/Login.cpython-312.pyc differ diff --git a/python/test/Cilent/__pycache__/Session_server.cpython-312.pyc b/python/test/Cilent/__pycache__/Session_server.cpython-312.pyc new file mode 100644 index 0000000..d8fec5a Binary files /dev/null and b/python/test/Cilent/__pycache__/Session_server.cpython-312.pyc differ diff --git a/python/test/Cilent/__pycache__/__init__.cpython-312.pyc b/python/test/Cilent/__pycache__/__init__.cpython-312.pyc index b422f26..74814e9 100644 Binary files a/python/test/Cilent/__pycache__/__init__.cpython-312.pyc and b/python/test/Cilent/__pycache__/__init__.cpython-312.pyc differ diff --git a/python/test/StartClient.py b/python/test/StartClient.py new file mode 100644 index 0000000..e066230 --- /dev/null +++ b/python/test/StartClient.py @@ -0,0 +1,8 @@ +import wx +from Cilent import Client_main + +if __name__ == '__main__': + app = wx.App() + frame = Client_main("127.0.0.1", 8000) # 这里填写你的 ip_socker 和 port_socker + frame.Show() + app.MainLoop() diff --git a/python/test/main.py b/python/test/main.py deleted file mode 100644 index dc23853..0000000 --- a/python/test/main.py +++ /dev/null @@ -1,7 +0,0 @@ -import wx -from Cilent import LoginFrame -if __name__ == '__main__': - app = wx.App() - frame = LoginFrame() - frame.Show() - app.MainLoop() \ No newline at end of file diff --git a/python/test/test.py b/python/test/test.py index 0c3a962..203ef4d 100644 --- a/python/test/test.py +++ b/python/test/test.py @@ -1,121 +1,46 @@ -import wx,time -ID_EXIT=200 -ID_ABOUT=201 +import tkinter as tk +from tkinter import messagebox -class Frame(wx.Frame): #2 wx.Frame子类 - def __init__(self,parent = None,id = -1,title ='系统管理界面'): - wx.Frame.__init__(self,parent,id,title,size=(900,600)) - self.panel_Celan1 = None - self.panel_Celan2 = None - self.panel_Celan3 = None - self.panel_Celan1_1 =None - self.setupStatusBar() - self.InitCelan() - self.InitButton() +# 创建主窗口 +root = tk.Tk() +root.withdraw() # 隐藏主窗口 +# 弹出消息框 +messagebox.showinfo("标题", "消息内容") - #初始化状态栏 - def setupStatusBar(self): - # 状态栏 - sb = self.CreateStatusBar(2) # 2代表将状态栏分为两个 - self.SetStatusWidths([-1, -2]) # 比例为1:2 - self.SetStatusText("Ready", 0) # 0代表第一个栏,Ready为内容 - # timmer - self.timer = wx.PyTimer(self.Notify) - self.timer.Start(1000, wx.TIMER_CONTINUOUS) - self.Notify() +# 弹出警告框 +messagebox.showwarning("警告", "警告内容") - # 实时显示时间 - def Notify(self): - t = time.localtime(time.time()) - st = time.strftime('%Y-%m-%d %H:%M:%S', t) - self.SetStatusText(st, 1) # 这里的1代表将时间放入状态栏的第二部分上 +# 弹出错误框 +messagebox.showerror("错误", "错误内容") +# 弹出询问框 +result = messagebox.askquestion("询问", "是否继续?") +if result == 'yes': + print("用户选择了继续") +else: + print("用户选择了取消") - # 初始化登陆 - def InitButton(self): - self.panel_Celan1 = wx.Panel(self, pos=(400, 150), size=(300, 300)) - wx.StaticText(self.panel_Celan1,label="Username",pos=(20,20)) - wx.StaticText(self.panel_Celan1, label="Password", pos=(20, 50)) - self._username=wx.TextCtrl(self.panel_Celan1,pos=(110,15)) - self._passwd = wx.TextCtrl(self.panel_Celan1, pos=(110, 45),style=wx.TE_PASSWORD) +# 弹出确认框 +result = messagebox.askokcancel("确认", "是否继续?") +if result: + print("用户选择了继续") +else: + print("用户选择了取消") - self._submit_btn=wx.Button(self.panel_Celan1,label=u'提交',pos=(100,100),size=(50,30)) - self.panel_Celan1.Bind(wx.EVT_BUTTON,self.Onclick,self._submit_btn) +# 弹出是/否框 +result = messagebox.askyesno("是/否", "是否继续?") +if result: + print("用户选择了是") +else: + print("用户选择了否") +# 弹出重试/取消框 +result = messagebox.askretrycancel("重试/取消", "是否继续?") +if result: + print("用户选择了重试") +else: + print("用户选择了取消") - #处理登陆事件 - def Onclick(self,event): - global denglu_flag - if event.GetEventObject()==self._submit_btn: - user = self.GetUsername() - passwd = self.GetPasswd() - print(user+":"+passwd) - if(user == "wenli"and passwd == "123456"): - denglu_flag=True - self.panel_Celan1.Destroy() - self.panel_Celan1_1 =wx.Panel(self, pos=(400, 150), size=(300, 300)) - wx.StaticText(self.panel_Celan1_1, label="欢迎登陆", pos=(130, 150)) - def GetUsername(self): - return self._username.GetValue() - - def GetPasswd(self): - return self._passwd.GetValue() - - - - #处理侧栏的点击事件 - def Onclick_Ce(self,event): - global denglu_flag - if event.GetEventObject() == self._caidan1: - # 如果需要显示的地方存在其他面板,删除 - if self.panel_Celan2: - self.panel_Celan2.Destroy() - if self.panel_Celan3: - self.panel_Celan3.Destroy() - if not self.panel_Celan1 : - if(denglu_flag == False): - self.InitButton() - else: - if not self.panel_Celan1_1: - self.panel_Celan1_1 = wx.Panel(self, pos=(400, 150), size=(300, 300)) - wx.StaticText(self.panel_Celan1_1, label="欢迎登陆", pos=(130, 150)) - - - if event.GetEventObject()==self._caidan2: - # 如果需要显示的地方存在其他面板,删除 - if self.panel_Celan1: - self.panel_Celan1.Destroy() - if self.panel_Celan1_1: - self.panel_Celan1_1.Destroy() - if self.panel_Celan3: - self.panel_Celan3.Destroy() - if not self.panel_Celan2 : - self.panel_Celan2 = wx.Panel(self, pos=(200, 0), size=(700, 700)) - - if event.GetEventObject() == self._caidan3: - if self.panel_Celan1: - self.panel_Celan1.Destroy() - if self.panel_Celan1_1: - self.panel_Celan1_1.Destroy() - if self.panel_Celan2 : - self.panel_Celan2.Destroy() - if not self.panel_Celan3: - self.panel_Celan3 = wx.Panel(self, pos=(400, 150), size=(300, 300)) - wx.StaticText(self.panel_Celan3, label="公告", pos=(130, 150)) - - -class App(wx.App): #5 wx.App子类 - def __init__(self): - #如果要重写__init__,必须调用wx.App的__init__,否则OnInit方法不会被调用 - wx.App.__init__(self) - def OnInit(self): - self.frame=Frame() - self.SetTopWindow(self.frame) - self.frame.Show() - - return True -if __name__=="__main__": - denglu_flag = False - app = App() - app.MainLoop() \ No newline at end of file +# 显示主窗口 +root.mainloop()