practice_code/python/test/Client/Page/Login.py
2024-04-20 17:36:36 +08:00

271 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import multiprocessing
import os
import wx
import threading
import time
from Client.Transmission.Process_Client import ProcessClient
from .Chat_main import ChatFrame
def open_chat_window(Id):
app = wx.App()
ChatFrame(Id).Show()
app.MainLoop()
class LoginFrame(wx.Frame, ProcessClient):
def __init__(self):
wx.Frame.__init__(self, None, id=-1, title='登录', pos=wx.DefaultPosition, size=(380, 300))
ProcessClient.__init__(self)
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()
# 登录菜单
login_menu = wx.Menu()
menu_bar.Append(login_menu, "登录")
# 更多菜单
more_menu = wx.Menu()
self.register_id = wx.NewId()
self.set_server_id = wx.NewId()
more_menu.Append(self.register_id, "注册账号")
more_menu.Append(self.set_server_id, "服务器设置")
menu_bar.Append(more_menu, "更多")
self.SetMenuBar(menu_bar)
# 创建状态栏
self.status_bar = self.CreateStatusBar(2)
self.server_status = False # 服务器状态
status_thread = threading.Thread(target=self.update_status_bar(None), 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.set_server_id)
self.Bind(wx.EVT_MENU_OPEN, self.click_menu_title)
# 创建注册面板
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.login_panel = LoginPanel(self)
self.register_panel = RegisterPanel(self)
self.sizer.Add(self.login_panel, 1, wx.EXPAND)
self.sizer.Add(self.register_panel, 1, wx.EXPAND)
self.login_panel.Hide()
self.register_panel.Hide()
self.login_panel.Show()
# 主页按钮绑定
self.Bind(wx.EVT_BUTTON, self.send_login_button, self.login_panel.LoginPanel_login_label)
self.Bind(wx.EVT_BUTTON, self.send_register_button, self.register_panel.RegisterPanel_login_label)
self.SetSizer(self.sizer)
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()
if menu_title == "登录":
self.login_panel.Hide()
self.register_panel.Hide()
self.login_panel.Show()
self.Layout()
# 点击菜单检测
def click_menu(self, event):
menu_id = event.GetId()
if menu_id == self.register_id:
self.login_panel.Hide()
self.register_panel.Hide()
self.register_panel.Show()
self.Layout()
elif menu_id == self.set_server_id:
self.login_panel.Hide()
self.register_panel.Hide()
self.Layout()
def login_page_receive(self, receive_content):
if receive_content["genre"] == '登录':
match receive_content["data"]['status']:
case 0:
self.Process_client_send("File_operate", "detection_data", receive_content["data"]['account'])
wx.MessageBox('登录成功正在获取数据', '登录', wx.OK | wx.ICON_INFORMATION)
case -1:
wx.MessageBox('重复登录', '登录', wx.OK | wx.ICON_INFORMATION)
case 1:
wx.MessageBox('密码错误', '登录', wx.OK | wx.ICON_INFORMATION)
case 2:
wx.MessageBox('未找到该账号', '登录', wx.OK | wx.ICON_INFORMATION)
elif receive_content["genre"] == '注册':
wx.MessageBox(
f'注册成功\n网名 : {receive_content["data"]['NetName']} \n账号 : {receive_content["data"]['Id']} \n密码 : {receive_content["data"]['Password']}',
'注册', wx.OK | wx.ICON_INFORMATION)
def send_login_button(self, event):
if self.server_status:
account = self.login_panel.LoginPanel_account_text.GetValue().strip()
password = self.login_panel.LoginPanel_password_text.GetValue().strip()
content = {'account': account, 'password': password}
target = "服务器"
genre = "登录"
data = {"genre": genre, "target": target, "content": content}
if account and password:
self.Process_client_send("Session_server", "send_server", data)
def send_register_button(self, event):
if self.server_status:
account = self.register_panel.RegisterPanel_account_text.GetValue().strip()
password = self.register_panel.RegisterPanel_password_text.GetValue().strip()
content = {'account': account, 'password': password}
target = "服务器"
genre = "注册"
data = {"genre": genre, "target": target, "content": content}
if account and password:
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'])
case '更新完成':
multiprocessing.Process(target=open_chat_window, args=(data['content'],)).start()
self.Destroy()
class LoginPanel(wx.Panel):
def __init__(self, parent):
super().__init__(parent)
# 主盒子
LoginPanel_main_box = wx.BoxSizer(wx.VERTICAL)
# 顶部盒子,目前只放了软件名
LoginPanel_top_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子
LoginPanel_show_title = wx.StaticText(self, label='登录')
LoginPanel_show_title.SetFont(wx.Font(30, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
LoginPanel_top_box.Add(LoginPanel_show_title, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
LoginPanel_main_box.Add(LoginPanel_top_box, 0, wx.EXPAND)
# 中部盒子,放账号和密码
LoginPanel_content_box = wx.BoxSizer(wx.VERTICAL)
# 账号
LoginPanel_account_box = wx.BoxSizer(wx.HORIZONTAL)
LoginPanel_account_label = wx.StaticText(self, label=' 账号:')
LoginPanel_account_label.SetFont(
wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
LoginPanel_account_box.Add(LoginPanel_account_label, 0, wx.ALIGN_CENTER_VERTICAL)
self.LoginPanel_account_text = wx.TextCtrl(self, size=(300, 30))
self.LoginPanel_account_text.SetHint('请输入账号')
LoginPanel_account_box.Add(self.LoginPanel_account_text, 1, wx.ALIGN_CENTER_VERTICAL)
LoginPanel_content_box.Add(LoginPanel_account_box)
# 添加空白控件来增加间距
LoginPanel_content_box.Add(wx.StaticText(self, label=''), 0, wx.ALL, 5)
# 密码
LoginPanel_password_box = wx.BoxSizer(wx.HORIZONTAL)
LoginPanel_password_label = wx.StaticText(self, label=' 密码:')
LoginPanel_password_label.SetFont(
wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
LoginPanel_password_box.Add(LoginPanel_password_label, 0, wx.ALIGN_CENTER_VERTICAL)
self.LoginPanel_password_text = wx.TextCtrl(self, size=(300, 30))
self.LoginPanel_password_text.SetHint('请输入密码')
LoginPanel_password_box.Add(self.LoginPanel_password_text, 1, wx.ALIGN_CENTER_VERTICAL)
LoginPanel_content_box.Add(LoginPanel_password_box)
LoginPanel_main_box.Add(LoginPanel_content_box, 0, wx.EXPAND)
# 底部盒子
LoginPanel_bottom_box = wx.BoxSizer(wx.VERTICAL)
# 登录按钮
LoginPanel_login_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子布局
self.LoginPanel_login_label = wx.Button(self, size=(200, 50), label='登录')
LoginPanel_login_box.AddStretchSpacer() # 添加一个可伸缩的空间,将登录按钮推到垂直中间
LoginPanel_login_box.Add(self.LoginPanel_login_label, 0, wx.ALIGN_CENTER_HORIZONTAL) # 将登录按钮添加到垂直盒子中
LoginPanel_login_box.AddStretchSpacer() # 再次添加一个可伸缩的空间,将登录按钮推到垂直中间
LoginPanel_bottom_box.Add(LoginPanel_login_box, 1,
wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL) # 将垂直盒子添加到底部盒子中,设置垂直和水平居中对齐
LoginPanel_main_box.Add(LoginPanel_bottom_box, 1, wx.EXPAND) # 将底部盒子添加到主盒子中,使其填满剩余空间
self.SetSizer(LoginPanel_main_box)
class RegisterPanel(wx.Panel):
def __init__(self, parent):
super().__init__(parent)
# 主盒子
RegisterPanel_main_box = wx.BoxSizer(wx.VERTICAL)
# 顶部盒子,目前只放了软件名
RegisterPanel_top_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子
RegisterPanel_show_title = wx.StaticText(self, label='注册')
RegisterPanel_show_title.SetFont(
wx.Font(30, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
RegisterPanel_top_box.Add(RegisterPanel_show_title, 1, wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, 10)
RegisterPanel_main_box.Add(RegisterPanel_top_box, 0, wx.EXPAND)
# 中部盒子,放账号和密码
RegisterPanel_content_box = wx.BoxSizer(wx.VERTICAL)
# 账号
RegisterPanel_account_box = wx.BoxSizer(wx.HORIZONTAL)
RegisterPanel_account_label = wx.StaticText(self, label=' 用户名:')
RegisterPanel_account_label.SetFont(
wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
RegisterPanel_account_box.Add(RegisterPanel_account_label, 0, wx.ALIGN_CENTER_VERTICAL)
self.RegisterPanel_account_text = wx.TextCtrl(self, size=(300, 30))
self.RegisterPanel_account_text.SetHint('请输入用户名')
RegisterPanel_account_box.Add(self.RegisterPanel_account_text, 1, wx.ALIGN_CENTER_VERTICAL)
RegisterPanel_content_box.Add(RegisterPanel_account_box)
# 添加空白控件来增加间距
RegisterPanel_content_box.Add(wx.StaticText(self, label=''), 0, wx.ALL, 5)
# 密码
RegisterPanel_password_box = wx.BoxSizer(wx.HORIZONTAL)
RegisterPanel_password_label = wx.StaticText(self, label=' 密码: ')
RegisterPanel_password_label.SetFont(
wx.Font(15, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
RegisterPanel_password_box.Add(RegisterPanel_password_label, 0, wx.ALIGN_CENTER_VERTICAL)
self.RegisterPanel_password_text = wx.TextCtrl(self, size=(300, 30))
self.RegisterPanel_password_text.SetHint('请输入密码')
RegisterPanel_password_box.Add(self.RegisterPanel_password_text, 1, wx.ALIGN_CENTER_VERTICAL)
RegisterPanel_content_box.Add(RegisterPanel_password_box)
RegisterPanel_main_box.Add(RegisterPanel_content_box, 0, wx.EXPAND)
# 底部盒子
RegisterPanel_bottom_box = wx.BoxSizer(wx.VERTICAL)
# 登录按钮
RegisterPanel_register_box = wx.BoxSizer(wx.VERTICAL) # 使用垂直盒子布局
self.RegisterPanel_login_label = wx.Button(self, size=(200, 50), label='确认')
RegisterPanel_register_box.AddStretchSpacer() # 添加一个可伸缩的空间,将登录按钮推到垂直中间
RegisterPanel_register_box.Add(self.RegisterPanel_login_label, 0,
wx.ALIGN_CENTER_HORIZONTAL) # 将登录按钮添加到垂直盒子中
RegisterPanel_register_box.AddStretchSpacer() # 再次添加一个可伸缩的空间,将登录按钮推到垂直中间
RegisterPanel_bottom_box.Add(RegisterPanel_register_box, 1,
wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL) # 将垂直盒子添加到底部盒子中,设置垂直和水平居中对齐
RegisterPanel_main_box.Add(RegisterPanel_bottom_box, 1, wx.EXPAND) # 将底部盒子添加到主盒子中,使其填满剩余空间
self.SetSizer(RegisterPanel_main_box)