from PySide2.QtGui import QCloseEvent from module import * class Login_Window_app(QWidget): def __init__(self): super().__init__() self.run_myapp() self.run_app() def run_app(self): self.setWindowTitle(apps.window_title_apps_name) self.setWindowFlags(Qt.FramelessWindowHint) self.setFixedSize(250, 110) hbox = QHBoxLayout() self.title = QLabel(text="正在启动 CRA-SERVER CLIENT") self.title.setStyleSheet("font-size: 15px;") hbox.addWidget(self.title, alignment=Qt.AlignCenter | Qt.AlignCenter) self.setLayout(hbox) def run_myapp(self): self.th_start_config = apps.Thread_appcode_login_user() self.th_start_config.data_th.connect(self.run_th_app) self.th_start_config.start() return None def run_th_app(self, data_config: dict): self.destroy() if data_config.get("code") == 9: error_str = data_config.get("data_config") message_error = apps.Message_yes_no(message="在启动客户端时发生严重错误,请复制以下错误信息发送给开发者或管理员,单击确定即可复制\n\n" + error_str.get("error")) if message_error.value() is True: pyperclip.copy(error_str.get("error")) return sys.exit(0) if data_config.get("code") == 2: apps.Message_ok(message="网络出问题了,请检查完网络连接再来哦主人") return sys.exit(0) if data_config.get("code") != 1: self.start_cramc_server_client_myapp = My_APP_Window(data=data_config.get("data_config"), code=data_config.get("code")) self.start_cramc_server_client_myapp.show() return None os.remove(apps.login_json_file) apps.Message_ok(message="CRA-USER已过期,请重新登录") self.login_user_window = Login_users_window_app() self.login_user_window.show() return None def closeEvent(self, event: QCloseEvent) -> None: self.destroy() return sys.exit(0) class Login_users_window_app(QWidget): def __init__(self): super().__init__() self.setWindowFlags(Qt.FramelessWindowHint) self.setFixedSize(apps.window_size_int[0], apps.window_size_int[1]) self.setWindowTitle(apps.window_title_apps_name + " - 登录") self.draggable = False self.offset = None window_box = QGridLayout() title_hbox = QHBoxLayout() title_hbox.addWidget(QLabel(apps.window_title_apps_name), alignment=Qt.AlignLeft | Qt.AlignTop) close_app_button = QToolButton() close_app_button.setIcon(QIcon("style/exit.png")) close_app_button.clicked.connect(self.close_apps_button_ttols) title_hbox.addWidget(close_app_button, alignment=Qt.AlignRight | Qt.AlignTop) login_user_box_hbox = QVBoxLayout() login_user_box_hbox.setContentsMargins(250, 0, 250, 0) login_user_box = QGridLayout() login_user_box.setSpacing(15) login_user_box.addWidget(QLabel(text="用户名:"), 0, 0, alignment=Qt.AlignTop) self.username = QLineEdit() self.username.setPlaceholderText("请输入CRA-USER用户名") login_user_box.addWidget(self.username, 0, 1, alignment=Qt.AlignTop) login_user_box.addWidget(QLabel(text="密码:"), 1, 0, alignment=Qt.AlignTop) self.password = QLineEdit() self.password.setPlaceholderText("请输入CRA-USER密码") self.password.setEchoMode(QLineEdit.Password) login_user_box.addWidget(self.password, 1, 1, alignment=Qt.AlignTop) login_user_button = QPushButton(text="登录") login_user_button.clicked.connect(self.login_users_mcgames) login_user_box.addWidget(login_user_button, 2, 0, 1, 0) register_user = QToolButton(text="注册") register_user.clicked.connect(lambda: os.startfile(apps.register_web_page)) reload_password = QToolButton(text="忘记密码?") reload_password.clicked.connect(lambda: os.startfile(apps.reload_password_page)) login_user_box.addWidget(register_user, 3, 0, alignment=Qt.AlignTop | Qt.AlignLeft) login_user_box.addWidget(reload_password, 3, 1, alignment=Qt.AlignTop | Qt.AlignRight) login_user_box_hbox.addLayout(login_user_box) window_box.addLayout(title_hbox, 0, 0, alignment=Qt.AlignTop) window_box.addLayout(login_user_box_hbox, 1, 0, alignment=Qt.AlignTop | Qt.AlignCenter) self.setLayout(window_box) def login_users_mcgames(self): if self.username.text() == "" or self.password.text() == "": return apps.Message_ok(message="请填写完整的账号信息用户名和密码") login_json = { "username": self.username.text(), "password": self.password.text() } url_https_mc_login = requests.post(url=apps.aotu_user_url + "authserver/authenticate", headers=apps.login_headers, json=login_json) url_https_mc_login_json = url_https_mc_login.json() if url_https_mc_login_json.get("error") == "ForbiddenOperationException": return apps.Message_ok(message=url_https_mc_login_json.get("errorMessage")) data_login_file = { "accessToken": url_https_mc_login_json.get("accessToken"), "clientToken": url_https_mc_login_json.get("clientToken"), "id": url_https_mc_login_json["selectedProfile"]["id"], "name": url_https_mc_login_json["selectedProfile"]["name"] } with open(file=apps.login_json_file, mode='w', encoding="UTF-8", newline='') as f_write: json.dump(data_login_file, f_write) self.destroy() self.login_user_window = Login_Window_app() self.login_user_window.show() return None def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.draggable = True self.offset = event.pos() def mouseMoveEvent(self, event): if self.draggable: self.move(event.globalPos() - self.offset) def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.draggable = False def closeEvent(self, event: QCloseEvent) -> None: self.destroy() return sys.exit(0) def close_apps_button_ttols(self): self.destroy() return sys.exit(0) class My_APP_Window(QTabWidget): def __init__(self, data: dict, code: int): super().__init__() self.data = data self.code = code self.server_list_dict: dict = self.data.get("server_list") self.server_id_dict_list: dict = self.data.get("server_id_list") self.setWindowFlags(Qt.FramelessWindowHint) self.setFixedSize(apps.window_size_int[0], apps.window_size_int[1]) self.setWindowTitle(apps.window_title_apps_name) self.draggable = False self.offset = None self.run_my_gui() def run_my_gui(self): gui_box_grid = QGridLayout() gui_box_grid.setColumnMinimumWidth(0, 0) title_name = QLabel(text=apps.window_title_apps_name) gui_box_grid.addWidget(title_name, 0, 0, alignment=Qt.AlignTop | Qt.AlignLeft) zxh_button = QToolButton() zxh_button.setIcon(QIcon("style/zxh.png")) zxh_button.clicked.connect(self.zxh_apps) exit_button = QToolButton() exit_button.setIcon(QIcon("style/exit.png")) exit_button.clicked.connect(self.exit_window_apps) window_header_gridbox = QHBoxLayout() window_header_gridbox.setContentsMargins(0, 0, 0, 0) window_header_gridbox.addStretch(0) window_header_gridbox.addWidget(zxh_button, alignment=Qt.AlignTop | Qt.AlignRight) window_header_gridbox.addWidget(exit_button, alignment=Qt.AlignTop | Qt.AlignRight) gui_box_grid.addLayout(window_header_gridbox, 0, 1) self.index_home = QWidget() self.craserver_client_settings = Craserver_client_settings() self.craserver_client_game_settings = App_settings_tab() self.craserver_client_user_settings = QWidget() self.header_tab = QTabWidget() self.header_tab.setContentsMargins(0, 0, 0, 0) self.header_tab.addTab(self.index_home, "主页") self.header_tab.addTab(self.craserver_client_settings, "管理") self.header_tab.addTab(self.craserver_client_game_settings, "设置") self.header_tab.addTab(self.craserver_client_user_settings, "CRA-USER") gui_box_grid.addWidget(self.header_tab, 1, 0, 1, 0) self.setLayout(gui_box_grid) self.index_home_page() self.craserver_client_user_settings_page() def craserver_client_user_settings_page(self): self.gamer_name_user = self.data.get("name") v_box = QVBoxLayout() v_box.setSpacing(25) login_user_panel_button = QPushButton(text="控制台") login_user_panel_button.setFixedSize(250, 35) login_user_panel_button.clicked.connect(lambda: os.startfile("https://login.mc-user.com:233/account/index")) exit_user_login_button = QPushButton(text="退出登录") exit_user_login_button.setFixedSize(250, 35) exit_user_login_button.clicked.connect(self.exit_user_apps) v_box.addWidget(QLabel(text=self.gamer_name_user), alignment=Qt.AlignCenter | Qt.AlignCenter) user_button_hbox = QHBoxLayout() user_button_hbox.setContentsMargins(200, 0, 200, 300) user_button_hbox.addWidget(login_user_panel_button, alignment=Qt.AlignTop | Qt.AlignCenter) user_button_hbox.addWidget(exit_user_login_button, alignment=Qt.AlignTop | Qt.AlignCenter) v_box.addLayout(user_button_hbox) join_qq_group = QPushButton(text="加入QQ群") join_kook = QPushButton(text="加入KOOK") self.craserver_client_user_settings.setLayout(v_box) def exit_user_apps(self): message = apps.Message_yes_no(message="确定要退出登录吗?") if message.value() is True: with open(file=apps.login_json_file, mode='r', encoding="UTF-8", newline='') as f: data_json = json.load(f) data_exit_user = { "accessToken": data_json.get("accessToken"), "clientToken": data_json.get("clientToken") } requests.post(url=apps.aotu_user_url + "authserver/invalidate", headers=apps.login_headers, json=data_exit_user) os.remove(apps.login_json_file) self.destroy() self.login_window_user_app = Login_users_window_app() self.login_window_user_app.show() return None def index_home_page(self): index_home_grid_box = QGridLayout() search_box = QHBoxLayout() self.search_lineedit = QLineEdit() self.search_lineedit.setPlaceholderText("输入服务器名称或ID搜索") search_button = QPushButton(text="搜索") search_button.setFixedWidth(120) reload_server_list_button = QPushButton(text="显示全部") reload_server_list_button.setFixedWidth(120) search_box.addWidget(self.search_lineedit) search_box.addWidget(search_button) search_box.addWidget(reload_server_list_button) index_home_grid_box.addLayout(search_box, 0, 0, alignment=Qt.AlignTop | Qt.AlignTop) self.server_list = QListWidget() self.server_ip_list = QListWidget() self.server_ip_list.setFixedSize(500, 55) self.server_ip_list.setFlow(QListView.LeftToRight) index_home_grid_box.addWidget(self.server_ip_list, 2, 0, alignment=Qt.AlignLeft | Qt.AlignBottom) self.start_game_button = QPushButton(text="启动游戏") self.start_game_button.clicked.connect(self.start_games_apps) self.start_game_button.setFixedSize(200, 55) index_home_grid_box.addWidget(self.server_list, 1, 0) index_home_grid_box.addWidget(self.start_game_button, 2, 0, alignment=Qt.AlignRight | Qt.AlignBottom) for i_server_list_for in self.server_list_dict: item = apps.customQListWidgetItem(image=i_server_list_for.get("image"), names=i_server_list_for.get("servername"), tests=i_server_list_for.get("summary")) self.server_list.addItem(item) self.server_list.setItemWidget(item, item.item_widget) self.index_home.setLayout(index_home_grid_box) def start_games_apps(self): if self.server_list.currentRow() == -1: return apps.Message_ok(message="请先选择需要加入的服务器") if self.server_ip_list.currentRow() == -1: return apps.Message_ok(message="请选择一条线路") start_game_name = self.server_id_dict_list[self.server_list.currentRow()] return None def stop_rungame_apps(self): return None def zxh_apps(self): return self.showMinimized() def exit_window_apps(self): self.destroy() return sys.exit(0) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.draggable = True self.offset = event.pos() def mouseMoveEvent(self, event): if self.draggable: self.move(event.globalPos() - self.offset) def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.draggable = False def closeEvent(self, event: QCloseEvent) -> None: self.destroy() return sys.exit(0) class App_settings_tab(QTabWidget): def __init__(self): super().__init__() self.game_settings = QWidget() self.app_settings = QWidget() self.addTab(self.game_settings, "游戏") self.addTab(self.app_settings, "客户端") self.game_settings_page() self.app_settings_page() def game_settings_page(self): pass def app_settings_page(self): pass class Craserver_client_settings(QTabWidget): def __init__(self): super().__init__() self.mods_settings = QWidget() self.sh_settings = QWidget() self.addTab(self.mods_settings, "MODS列表") self.addTab(self.sh_settings, "光影管理") self.mods_settings_page() self.sh_settings_page() def mods_settings_page(self): pass def sh_settings_page(self): pass if __name__ == '__main__': is_json_none = False QGuiApplication.setHighDpiScaleFactorRoundingPolicy( Qt.HighDpiScaleFactorRoundingPolicy.PassThrough ) QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication() if os.path.exists("config_app") is False: os.mkdir("config_app") if os.path.isfile(apps.login_json_file) is False: window = Login_users_window_app() if os.path.isfile(apps.login_json_file) is True: with open(file=apps.login_json_file, mode='r', encoding="UTF-8", newline='') as f_read: json_test = json.load(f_read) is_json_none = all(json_test) if is_json_none is False: window = Login_users_window_app() if os.path.isfile(apps.login_json_file) is True & is_json_none is True: window = Login_Window_app() window.show() sys.exit(app.exec_())