From 836a876c7e9b0b4f34ec170500dcbd1145e05f30 Mon Sep 17 00:00:00 2001 From: xystudio <173288240@qq.com> Date: Thu, 2 Jul 2026 17:27:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(clickmouse):0ca1=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E8=8F=9C=E5=8D=95=E7=9A=84=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加genver的hook,用于生成编译号 - 修复大量install_pack程序bug - 修改“关于”菜单,添加编译号显示,缩小按钮大小 --- Gui/install_pack.py | 11 ++++++++++- Gui/logger.py | 2 +- Gui/main.py | 16 ++++++++++++---- Gui/res/langs/langs.json | 4 ++-- Gui/res/versions.json | 2 +- Gui/sharelibs.py | 4 +++- Gui/uiStyles/widgets.py | 8 ++++---- hooks/genver.py | 12 ++++++++++++ makefile | 2 +- 9 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 hooks/genver.py diff --git a/Gui/install_pack.py b/Gui/install_pack.py index 10d75b8e..8ef5f9b9 100644 --- a/Gui/install_pack.py +++ b/Gui/install_pack.py @@ -216,7 +216,7 @@ def apply_titleBar(self, window: QMainWindow | QDialog): '''应用标题栏样式''' hwnd = window.winId().__int__() - if select_styles.css_data['.meta']['--mode'] == 'dark': + if select_styles.css_data['.meta']['mode'] == 'dark': is_dark_mode = 1 else: is_dark_mode = 0 @@ -614,6 +614,9 @@ def update_buttons(self): self.next_btn.setVisible(True) self.cancel_btn.setVisible(True) self.finish_btn.setVisible(False) + + if self.current_page == self.PAGE_read_license: + self.next_btn.setEnabled(False) # 复制错误 if self.current_page == self.PAGE_error: @@ -813,6 +816,12 @@ def on_prev(self): if self.current_page == self.PAGE_set_components and is_ipk: # 第四页ipk:回滚要跳跃 self.set_page(self.PAGE_hello) + return + if self.current_page == self.PAGE_read_license: + # 读取许可协议返回:回复启用按钮 + self.next_btn.setEnabled(True) + self.emua_checkbox.setChecked(False) + super().on_prev() def closeEvent(self, event): if self.current_page < self.PAGE_finish: diff --git a/Gui/logger.py b/Gui/logger.py index 956e6e81..27e4b083 100644 --- a/Gui/logger.py +++ b/Gui/logger.py @@ -157,7 +157,7 @@ def wrapper(*args, **kwargs): result = func(*args, **kwargs) except Exception as e: trace = traceback.format_exc() - self.exception(out_service_id, trace, f'Function {function_name} raised an unexpected exception', extra={'service_id': out_service_id, **end_extra_out}) + self.exception(out_service_id, f'Function {function_name} raised an unexpected exception', extra={'service_id': out_service_id, **end_extra_out}, mode=ExceptionVal.raise_trace | ExceptionVal.output_msg | ExceptionVal.exit) QMessageBox.critical(None, 'An unexpected error occurred', f'An unexpected error occurred in {function_name}: \n{trace}\nPlease look the log path: {(folder_path / f"{log_id}.log").resolve()} and send me the log file on issue: https://github.com/xystudiocode/pyClickMouse/issues/new/choose') sys.exit(1) # 退出程序 log_func(f'Function {function_name} running successfull, returned: {result}', extra={'service_id': out_service_id, **end_extra_out}) diff --git a/Gui/main.py b/Gui/main.py index 2f17336e..eea23af9 100644 --- a/Gui/main.py +++ b/Gui/main.py @@ -1611,7 +1611,8 @@ def init_ui(self): # 版本信息 version_status_text = get_lang('65') if is_pre else '' - version = QLabel(get_lang('1c').format(__version__, version_status_text)) + + version = QLabel(get_lang('1c').format(__version__, version_status_text, build_number)) about = QLabel(get_lang('1d')) # 按钮 @@ -1621,9 +1622,9 @@ def init_ui(self): # 布局 central_layout.addWidget(self.image_label, 0, 0, 1, 1) - central_layout.addWidget(version, 0, 1, 1, 2) - central_layout.addWidget(about, 2, 0, 1, 3) - central_layout.addWidget(ok_button, 3, 2) + central_layout.addWidget(version, 0, 1, 1, 4) + central_layout.addWidget(about, 2, 0, 1, 5) + central_layout.addWidget(ok_button, 3, 4) self.setLayout(central_layout) @@ -2292,6 +2293,12 @@ def create_setting_page_value(self): self.page_update = self.page_choice_buttons[3] # 更新设置 self.page_hotkey = self.page_choice_buttons[4] # 热键设置 self.page_doc = self.page_choice_buttons[5] # 文档设置 + if dev_flags.get('new_settings', False): + self.page_notify = self.page_choice_buttons[6] # 通知设置 + self.page_flags = self.page_choice_buttons[7] # 标志设置 + else: + self.page_flags = self.page_choice_buttons[6] # 标志设置 + self.page_notify = '' def check_values(self): '''检查设置值''' @@ -3112,6 +3119,7 @@ def run_command(self, command): is_running = any(list(map(lambda x: QSharedMemory(x).attach(), mem_id[3:4]))) if is_running: # 已经有一个实例在运行 + QMessageBox.critical(None, get_lang('14'), get_lang('d6')) sys.exit(2) with open(get_resource_path('langs', 'packages.json'), 'r', encoding='utf-8') as f: diff --git a/Gui/res/langs/langs.json b/Gui/res/langs/langs.json index 4d6a0c7a..3d808893 100644 --- a/Gui/res/langs/langs.json +++ b/Gui/res/langs/langs.json @@ -33,7 +33,7 @@ "19": "Current is the latest version.", "1a": "Please enter a valid positive integer delay.", "1b": "An error occurred: ", - "1c": "ClickMouse {1},Version {0}\n\n A fast,simple and convinient mouse clicker \nmade with python.", + "1c": "ClickMouse {1},Version {0}\nBuild number {2}\n\n A fast,simple and convinient mouse clicker \nmade with python.", "1d": "This software is open source under the MIT license, and you\ncan copy, modify, and distribute it. The author is xystudio.", "1e": "OK", "1f": "Cancel", @@ -254,7 +254,7 @@ "19": "当前已是最新版本。", "1a": "请输入有效的正整数延迟。", "1b": "发生错误: ", - "1c": "ClickMouse{1},版本{0}\n\n一款快捷,简洁,轻便;使用python制作的鼠标连点\n器。", + "1c": "ClickMouse{1},版本{0}\n编译号{2}\n\n一款快捷,简洁,轻便;使用python制作的鼠标连点\n器。", "1d": "本软件使用MIT许可证开源,可以复制,修改,分发等;作者为\nxystudio。", "1e": "确定", "1f": "取消", diff --git a/Gui/res/versions.json b/Gui/res/versions.json index 50d70f82..f6062b31 100644 --- a/Gui/res/versions.json +++ b/Gui/res/versions.json @@ -1 +1 @@ -{"clickmouse":"3.3.0.23alpha6"} +{"clickmouse":"3.3.0.23-alpha6", "build_number": "0ca1"} diff --git a/Gui/sharelibs.py b/Gui/sharelibs.py index 20764d1d..4c03ea41 100644 --- a/Gui/sharelibs.py +++ b/Gui/sharelibs.py @@ -170,7 +170,9 @@ def create_shortcut(path, target, description, work_dir = None, icon_path = None pass with open(get_resource_path('versions.json'), 'r') as f: - __version__ = json.load(f)['clickmouse'] + _data = json.load(f) + __version__ = _data['clickmouse'] + build_number = _data['build_number'] with open(get_resource_path('langs', 'units.json'), 'r', encoding='utf-8') as f: unit_lang = json.load(f) diff --git a/Gui/uiStyles/widgets.py b/Gui/uiStyles/widgets.py index 8d8b91e4..a6bbd343 100644 --- a/Gui/uiStyles/widgets.py +++ b/Gui/uiStyles/widgets.py @@ -22,10 +22,10 @@ class MessageButton: OKCANCEL = OK | CANCEL class ReturnValue: - YES = 0 - NO = 1 - OK = 2 - CANCEL = 3 + YES = 1 + NO = 2 + OK = 3 + CANCEL = 4 class MessageIcon: INFO = 0b1 diff --git a/hooks/genver.py b/hooks/genver.py new file mode 100644 index 00000000..0e1979f0 --- /dev/null +++ b/hooks/genver.py @@ -0,0 +1,12 @@ +import random + +str_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e', 'f'] + +# 生成随机四位hex + +string = '' + +for i in range(4): + string += random.choice(str_list) + +print(string) # 输出随机四位hex \ No newline at end of file diff --git a/makefile b/makefile index 00ce1da7..9ea25c3e 100644 --- a/makefile +++ b/makefile @@ -6,7 +6,7 @@ main: clickmouse: gui/main.py $(command) --file-description="Clickmouse" --product-name="ClickMouse" --windows-icon-from-ico=gui/res/icons/clickmouse/icon.ico --include-data-dir=gui/res/=res/ --include-data-file=gui/key=key gui/main.py --file-version="3.3.0.23" --windows-console-mode="disable" --enable-plugin=pyside6 --include-data-file=gui/7z.exe=7z.exe --include-data-file=gui/7z.dll=7z.dll --output-dir=dist/clickmouse/ $(command) --file-description="Clickmouse uninstall" --product-name="uninstall" --windows-icon-from-ico=gui/res/icons/clickmouse/uninstall.ico --file-version="2026.06.27.1" gui/uninstall.py --enable-plugin=pyside6 --windows-console-mode="disable" --windows-uac-admin --output-dir=dist/clickmouse/ - $(command) --file-description="Clickmouse IPK" --product-name="CmIPK" --windows-icon-from-ico=gui/res/icons/clickmouse/init.ico --file-version="2026.05.23.1" gui/install_pack.py --enable-plugin=pyside6 --windows-console-mode="disable" --output-dir=dist/clickmouse/ + $(command) --file-description="Clickmouse IPK" --product-name="CmIPK" --windows-icon-from-ico=gui/res/icons/clickmouse/init.ico --file-version="2026.07.02.1" gui/install_pack.py --enable-plugin=pyside6 --windows-console-mode="disable" --output-dir=dist/clickmouse/ $(command) --file-description="Clickmouse repair" --product-name="CmRepair" --windows-icon-from-ico=gui/res/icons/clickmouse/repair.ico --file-version="2026.05.23.1" gui/repair.py --enable-plugin=pyside6 --windows-console-mode="disable" --windows-uac-admin --output-dir=dist/clickmouse/ $(command) --file-version="2026.05.23.1" gui/check_reg_ver.py --windows-console-mode="disable" --output-dir=dist/clickmouse/ $(command) --file-version="2026.05.23.1" gui/updater.py --windows-console-mode="disable" --output-dir=dist/clickmouse/ From 3d373dc1e0524c385a10631d35ad372585acff8e Mon Sep 17 00:00:00 2001 From: xystudio <173288240@qq.com> Date: Sun, 5 Jul 2026 15:52:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(clickmouse)=203.3.0.23-alpha7:?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AF=95=E9=AA=8C=E9=A1=B9=E7=9B=AE=EF=BC=9A?= =?UTF-8?q?=E5=86=85=E8=81=94=E7=BD=91=E9=A1=B5=20-=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=AE=9E=E9=AA=8C:=E5=86=85=E8=BF=9E=E7=BD=91=E9=A1=B5=20-=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=87=E6=A1=A3=E7=AB=99"=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E6=96=87=E4=BB=B6"=E6=8C=89=E9=92=AE=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gui/main.py | 113 +++++-- Gui/res/WebviewTheme.js | 31 ++ Gui/res/dev_settings.json | 5 + Gui/res/langs/langs.json | 6 +- Gui/res/versions.json | 2 +- Gui/uiStyles/widgets.py | 2 +- MANIFEST.in | 1 + README-py.md | 18 - documents/.vitepress/config.js | 8 + .../.vitepress/theme/components/mdinput.vue | 6 +- documents/en/updatelog/beta/3/33023a7.md | 20 ++ documents/zh-CN/updatelog/beta/3/33023a7.md | 20 ++ hooks/genver.py | 6 +- makefile | 2 +- merge-distFolders.ps1 | 19 +- setup.py | 27 +- src/clickmouse_api/GUI/__init__.py | 5 - src/clickmouse_api/GUI/styles.py | 311 ------------------ src/clickmouse_api/__init__.py | 40 --- src/clickmouse_api/packageParser/__init__.py | 12 - 20 files changed, 220 insertions(+), 434 deletions(-) create mode 100644 Gui/res/WebviewTheme.js delete mode 100644 README-py.md create mode 100644 documents/en/updatelog/beta/3/33023a7.md create mode 100644 documents/zh-CN/updatelog/beta/3/33023a7.md diff --git a/Gui/main.py b/Gui/main.py index eea23af9..68950238 100644 --- a/Gui/main.py +++ b/Gui/main.py @@ -11,12 +11,13 @@ except: logger.exception('clickmouse.main', mode=ExceptionVal.all) from uiStyles.QUI import * +from PySide6.QtWebEngineWidgets import QWebEngineView +from PySide6.QtWebEngineCore import QWebEngineProfile, QWebEngineScript from uiStyles import * from datetime import datetime # 检查时间 from pynput import keyboard # 热键功能库 import pyautogui # 鼠标操作库 from time import sleep, time # 延迟 -from webbrowser import open as open_url # 关于作者 from check_update import check_update, web_data, download_file # 更新检查 from uiStyles import indexes as style_indexes from sharelibs import __version__ # 版本号 @@ -507,7 +508,15 @@ def get_num(input_value, value_default, err_use_default, default_var): if type == InputChange.setting_window: on_input_change(type=InputChange.main_window) # 刷新主窗口 return 0 - + +@logger.auto_logger('clickmouse.main') +def open_url(url, title: str=None, width:int=None, height:int=None, fixed:bool=False): + if dev_flags.get('inline_website'): + webview.show(url, title, width, height, fixed) + else: + from webbrowser import open as open_webbrowser + open_webbrowser(url) + class UMainWindow(QMainWindow): '''自定义窗口基类''' def __init__(self): @@ -532,7 +541,7 @@ def closeEvent(self, event): '''窗口关闭事件''' color_getter.style_changed.disconnect(self.func) return super().closeEvent(event) - + class UDialog(QDialog): '''自定义对话框基类''' def __init__(self): @@ -559,6 +568,51 @@ def closeEvent(self, event): color_getter.style_changed.disconnect(self.func) return super().closeEvent(event) +class UWebView(UMainWindow): + def __init__(self): + super().__init__() + self.setWindowFlags( + Qt.Window | Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint + ) # 设置窗口属性 + self.web = QWebEngineView() + self.profile = QWebEngineProfile.defaultProfile() + self.engine_script = QWebEngineScript() + + self.setCentralWidget(self.web) + + def show(self, url, title: str=None, width:int=None, height:int=None, fixed:bool=False): + title = title if title is not None else 'UWebView' + _width = width if width is not None else 640 + _height = height if height is not None else 480 + + webview.setWindowTitle(title) + webview.resize(_width, _height) + if fixed: + webview.setFixedSize(_width, _height) + + self.update_script(color_getter.is_dark_mode) + + self.web.setUrl(QUrl(url)) + + return super().show() + + def closeEvent(self, event): + '''窗口关闭事件''' + self.web.setUrl(QUrl('about:blank')) # 隐藏网页 + return super().closeEvent(event) + + @logger.auto_logger('clickmouse.webview', ['UWebView']) + def update_script(self, is_dark_mode: bool): + with open(get_resource_path('WebviewTheme.js'), "r", encoding='utf-8') as f: + self.script = f"var theme = '{'dark' if is_dark_mode else 'light'}';\n" + f.read() + + self.engine_script.setName('dark-mode') + self.engine_script.setInjectionPoint(QWebEngineScript.DocumentCreation) # 尽早注入 + self.engine_script.setWorldId(QWebEngineScript.MainWorld) + self.engine_script.setRunsOnSubFrames(True) + self.engine_script.setSourceCode(self.script) # 设置代码,配置深色浅色模式 + self.profile.scripts().insert(self.engine_script) + class MessageBox(UMessageBox): def __init__(self, parent: QWidget | None, title: str, text: str, icon: MessageIcon, buttons: MessageButton, defaultButton: MessageButton): super().__init__(parent, title, text, icon, buttons, defaultButton) @@ -871,7 +925,7 @@ def do_step(self, codes): logger.error(f'Step {code.__name__} Running failed: {e}') def refresh_title(self): - QTimer.singleShot(setting_value.soft_delay, color_getter.style_changed.emit) + QTimer.singleShot(setting_value.soft_delay, lambda: color_getter.style_changed.emit(bool(color_getter.is_dark_mode))) def left_check(self): if clicker.left_clicked: @@ -914,7 +968,7 @@ def run(self): run_software(python_path, exe_path) class ColorGetter(QObject): - style_changed = Signal() + style_changed = Signal(bool) def __init__(self): super().__init__() @@ -923,6 +977,7 @@ def __init__(self): # 记录当前主题 self.style = setting_value.select_style + self.is_dark_mode = 0 self.current_theme, self.windows_theme, self.windows_color, self.use_windows_color = self.load_theme() try: @@ -1020,15 +1075,15 @@ def apply_titleBar(self, window: QMainWindow | QDialog): hwnd = window.winId().__int__() if select_styles.css_data['.meta']['mode'] == 'dark': - is_dark_mode = 1 + self.is_dark_mode = 1 else: - is_dark_mode = 0 + self.is_dark_mode = 0 # 设置深色模式 ctypes.windll.dwmapi.DwmSetWindowAttribute( wintypes.HWND(hwnd), DWMWA_USE_IMMERSIVE, - ctypes.byref(wintypes.INT(is_dark_mode)), + ctypes.byref(wintypes.INT(self.is_dark_mode)), ctypes.sizeof(wintypes.INT) ) @@ -1212,40 +1267,40 @@ def create_menu_bar(self): menu_bar = self.menuBar() # 文件菜单 - file_menu = menu_bar.addMenu(get_lang('01')) + file_menu: QMenu = menu_bar.addMenu(get_lang('01')) # 清理缓存动作 - clean_cache_action = file_menu.addAction(get_lang('02')) + clean_cache_action: QAction = file_menu.addAction(get_lang('02')) # 退出动作 - exit_action = file_menu.addAction(get_lang('03')) + exit_action: QAction = file_menu.addAction(get_lang('03')) # 设置菜单 - settings_menu = menu_bar.addMenu(get_lang('04')) - settings_action = settings_menu.addAction(get_lang('05')) - attr_action = settings_menu.addAction(get_lang('8c')) + settings_menu: QMenu = menu_bar.addMenu(get_lang('04')) + settings_action: QAction = settings_menu.addAction(get_lang('05')) + attr_action: QAction = settings_menu.addAction(get_lang('8c')) # 更新菜单 - update_menu = menu_bar.addMenu(get_lang('06')) + update_menu: QMenu = menu_bar.addMenu(get_lang('06')) # 更新菜单动作 - update_check = update_menu.addAction(get_lang('07')) - update_log = update_menu.addAction(get_lang('08')) + update_check: QAction = update_menu.addAction(get_lang('07')) + update_log: QAction = update_menu.addAction(get_lang('08')) # 帮助菜单 - help_menu = menu_bar.addMenu(get_lang('09')) - about_action = help_menu.addAction(get_lang('0a')) + help_menu: QMenu = menu_bar.addMenu(get_lang('09')) + about_action: QAction = help_menu.addAction(get_lang('0a')) # 发送反馈 - create_issue_action = help_menu.addAction(get_lang('ba')) + create_issue_action: QAction = help_menu.addAction(get_lang('ba')) # 文档菜单 - doc = help_menu.addAction(get_lang('5f')) + doc: QAction = help_menu.addAction(get_lang('5f')) doc.triggered.connect(self.open_doc) # 扩展菜单 - extension_menu = menu_bar.addMenu(get_lang('8e')) - official_extension_menu = extension_menu.addMenu(get_lang('90')) + extension_menu: QMenu = menu_bar.addMenu(get_lang('8e')) + official_extension_menu: QMenu = extension_menu.addMenu(get_lang('90')) if not any(show_list): # 无官方扩展提示 official_extension_menu.addAction(get_lang('91')).setDisabled(True) @@ -1254,7 +1309,7 @@ def create_menu_bar(self): for name, show, package_id in zip(package_names, show_list, package_ids): if show: official_extension_menu.addAction(name).triggered.connect(lambda chk, idx=package_id: self.do_extension(idx)) # 给菜单项添加ID,方便绑定事件 - manage_extension_menu = official_extension_menu.addAction(get_lang('92')) + manage_extension_menu: QAction = official_extension_menu.addAction(get_lang('92')) manage_extension_menu.triggered.connect(self.show_manage_extension) # 管理扩展菜单 manage_extension_menu.setEnabled(has_packages) @@ -1288,7 +1343,7 @@ def create_menu_bar(self): update_check.triggered.connect(lambda: self.on_update(True)) settings_action.triggered.connect(self.show_setting) exit_action.triggered.connect(app.quit) - create_issue_action.triggered.connect(lambda: open_url(setting_value.feedback)) + create_issue_action.triggered.connect(lambda: open_url(setting_value.feedback, filter_hotkey(get_lang('ba')), 1000, 600, True)) attr_action.triggered.connect(self.show_attr) def open_doc(self, *, path: str=''): @@ -1307,7 +1362,7 @@ def open_doc(self, *, path: str=''): if doc_choice_lang not in supported_doc_lang: # 不受支持的语言包 doc_choice_lang = 'en' # 默认英文 - open_url(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang)) + open_url(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang), filter_hotkey(get_lang('5f')), 1000, 600, True) logger.info(f'{setting_value.default_doc_link}/{path}'.format(lang=doc_choice_lang)) @@ -1425,7 +1480,7 @@ def on_check_update(self): def save(self): '''保存更新缓存''' if should_check_update_res: - save_update_cache(should_update=result[0], latest_version=result[1], update_info=result[2], hash=result[3], update_version_tag=result[4]) # 缓存最新版本 + save_update_cache(should_update=result[0], latest_version=result[1], hash=result[3], update_version_tag=result[4]) # 缓存最新版本 def on_check_update_result(self, check_data): '''检查更新结果''' @@ -3179,12 +3234,15 @@ def run_command(self, command): DWMNCRP_ENABLED = 1 logger.info('Loading services') + icon = get_icon('icon') + refresh = Refresh() setting_value = SettingValue() clicker = Click() auto_start_manager = StartManager() color_getter = ColorGetter() run_after = RunAfter() + webview = UWebView() hotkey_listener = get_hotkey_listener_instance() logger.info('Loading value') @@ -3208,7 +3266,6 @@ def run_command(self, command): # 创建资源 update_cache = load_update_cache() should_check_update_res = should_check_update() if setting_value.update_enabled else False - icon = get_icon('icon') settings_need_restart = False can_update = False diff --git a/Gui/res/WebviewTheme.js b/Gui/res/WebviewTheme.js new file mode 100644 index 00000000..53093e7b --- /dev/null +++ b/Gui/res/WebviewTheme.js @@ -0,0 +1,31 @@ +// -- 1. 覆盖 matchMedia,使 prefers-color-scheme: dark 返回 true -- +(function() { + const _origMatchMedia = window.matchMedia.bind(window); + window.matchMedia = function(query) { + const mql = _origMatchMedia(query); + const regex = new RegExp(`prefers-color-scheme\\s*:\\s*${theme}`, 'i'); + if (regex.test(query)) { + Object.defineProperty(mql, 'matches', { + get: () => true, + configurable: true, + enumerable: true + }); + } + return mql; + }; +})(); + +// -- 2. 注入 color-scheme,让滚动条、表单控件等原生元素使用深色 -- +(function() { + function injectColorScheme() { + const style = document.createElement('style'); + style.id = `__qt_${theme}_color_scheme__`; + style.textContent = `:root { color-scheme: ${theme} !important; }`; + (document.head || document.documentElement).appendChild(style); + } + if (document.head) { + injectColorScheme(); + } else { + document.addEventListener('DOMContentLoaded', injectColorScheme); + } +})(); \ No newline at end of file diff --git a/Gui/res/dev_settings.json b/Gui/res/dev_settings.json index 45e6f184..f4ee74d3 100644 --- a/Gui/res/dev_settings.json +++ b/Gui/res/dev_settings.json @@ -8,5 +8,10 @@ "name": "Decoupling UI and program", "key": "decoupling", "desc": "To decouple the UI and program.This need to restart the program to\nake effect." + }, + { + "name": "Inline website", + "key": "inline_website", + "desc": "Website will show as a window if this is enabled." } ] diff --git a/Gui/res/langs/langs.json b/Gui/res/langs/langs.json index 3d808893..158fd3b5 100644 --- a/Gui/res/langs/langs.json +++ b/Gui/res/langs/langs.json @@ -217,7 +217,8 @@ "d8": "Modify click units using the default values", "d9": "If you enable it, click input blanks will use the default\nvalue when another one is filled. (by default, only all of the input boxes is\nblank will use the default value).", "da": "If you enable it, unit comboboxes as unit, and unit input as number.\nrepresenting the unit (by default, only the combo box equal to the settings will\nuse the default value).", - "db": "All" + "db": "All", + "dc": "Refresh" } }, { @@ -438,7 +439,8 @@ "d8": "使用默认值修改连点单位", "d9": "如果启用,点击输入框空白时会使用默认值,当其他输入框有值时,不会使用默认值。\n(默认情况下,只有所有输入框都为空时才会使用默认值)", "da": "如果启用,单位组合框作为单位,单位输入框作为数字代表单位(默认情况下,只有设置\n的值等于组合框的值时才会使用默认值)", - "db": "全部" + "db": "全部", + "dc": "刷新" } } ] \ No newline at end of file diff --git a/Gui/res/versions.json b/Gui/res/versions.json index f6062b31..e638f3e9 100644 --- a/Gui/res/versions.json +++ b/Gui/res/versions.json @@ -1 +1 @@ -{"clickmouse":"3.3.0.23-alpha6", "build_number": "0ca1"} +{"clickmouse":"3.3.0.23-alpha7", "build_number": "dev"} diff --git a/Gui/uiStyles/widgets.py b/Gui/uiStyles/widgets.py index a6bbd343..a59160a0 100644 --- a/Gui/uiStyles/widgets.py +++ b/Gui/uiStyles/widgets.py @@ -159,7 +159,7 @@ def showEvent(self, event): return super().showEvent(event) @classmethod - def infomation(cls, parent: QWidget | None, title: str, text: str, buttons: MessageButton = None, defaultButton: MessageButton = None): + def information(cls, parent: QWidget | None, title: str, text: str, buttons: MessageButton = None, defaultButton: MessageButton = None): buttons = MessageButton.OK if buttons is None else buttons defaultButton = MessageButton.OK if buttons is None else defaultButton return cls(parent, title, text, MessageIcon.INFO, buttons, defaultButton).exec() diff --git a/MANIFEST.in b/MANIFEST.in index e69de29b..1ebde624 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -0,0 +1 @@ +include README-zh_CN.md \ No newline at end of file diff --git a/README-py.md b/README-py.md deleted file mode 100644 index 89b00b03..00000000 --- a/README-py.md +++ /dev/null @@ -1,18 +0,0 @@ -# Python package usage - -## 📝 Installation -```bash -pip install ClickMouse -``` - -## 🚀 Usage -For Python call or .pyd call, use the following code: -```python -import clickmouse - -clickmouse.click_mouse(clickmouse.LEFT, 1000, 10, 10) # click left button 10 times, interval 1000ms, press duration 10ms -``` -~~Command line call~~ -```bash -ClickMouse.exe /h # show help -``` diff --git a/documents/.vitepress/config.js b/documents/.vitepress/config.js index 1db94306..3dcc35e8 100644 --- a/documents/.vitepress/config.js +++ b/documents/.vitepress/config.js @@ -233,6 +233,10 @@ export default withMermaid({ text: 'v3.x.x.x', collapsed: true, items: [ + { + text: '3.3.0.23alpha7', + link: '/en/updatelog/beta/3/33023a7', + }, { text: '3.3.0.23alpha6', link: '/en/updatelog/beta/3/33023a6', @@ -653,6 +657,10 @@ export default withMermaid({ text: 'v3.x.x.x', collapsed: true, items: [ + { + text: '3.3.0.23alpha7', + link: '/en/updatelog/beta/3/33023a7', + }, { text: '3.3.0.23alpha6', link: '/zh-CN/updatelog/beta/3/33023a6', diff --git a/documents/.vitepress/theme/components/mdinput.vue b/documents/.vitepress/theme/components/mdinput.vue index df55b174..f8d82d86 100644 --- a/documents/.vitepress/theme/components/mdinput.vue +++ b/documents/.vitepress/theme/components/mdinput.vue @@ -1440,6 +1440,10 @@ export default { border-radius: .375rem; } +.file-Btn:hover { + background-color: #f2f3f4 +} + .file-Btn span { display: flex; flex-direction: row; @@ -1450,7 +1454,7 @@ export default { color: #9198a1; } -.file-Btn:hover { +.dark .file-Btn:hover { background-color: #15191f; } \ No newline at end of file diff --git a/documents/en/updatelog/beta/3/33023a7.md b/documents/en/updatelog/beta/3/33023a7.md new file mode 100644 index 00000000..08ba9c76 --- /dev/null +++ b/documents/en/updatelog/beta/3/33023a7.md @@ -0,0 +1,20 @@ +--- +title: 3.3.0.23alpha7 +layout: doc +--- + +# 3.3.0.23alpha7 + +Release Date: 2026/07/05 + +> This is a development test version, the 6th release in the `3.3.0` development cycle. + +## What's New +- Added genver hook for generating build numbers +- Fixed a lot of bugs in the install_pack program +- Modified the 'About' menu, added build number display, and reduced button size +- New experiment: inline web pages +- Fixed the document site's 'Select File' button display issue + +## Download Link +[Click to Download](https://github.com/xystudiocode/pyClickMouse/releases/tag/3.3.0.23alpha7) \ No newline at end of file diff --git a/documents/zh-CN/updatelog/beta/3/33023a7.md b/documents/zh-CN/updatelog/beta/3/33023a7.md new file mode 100644 index 00000000..49de5e23 --- /dev/null +++ b/documents/zh-CN/updatelog/beta/3/33023a7.md @@ -0,0 +1,20 @@ +--- +title: 3.3.0.23alpha7 +layout: doc +--- + +# 3.3.0.23alpha7 + +发布日期:2026/07/05 + +> 这是一个开发测试版更新,为`3.3.0`的开发周期的第6个版本。 + +## 更新内容 +- 添加genver的hook,用于生成编译号 +- 修复大量install_pack程序bug +- 修改“关于”菜单,添加编译号显示,缩小按钮大小 +- 新增实验:内连网页 +- 修复文档站"选择文件"按钮显示错误 + +## 下载链接 +[点击下载](https://github.com/xystudiocode/pyClickMouse/releases/tag/3.3.0.23alpha7) diff --git a/hooks/genver.py b/hooks/genver.py index 0e1979f0..541eaa8d 100644 --- a/hooks/genver.py +++ b/hooks/genver.py @@ -6,7 +6,9 @@ string = '' -for i in range(4): - string += random.choice(str_list) +for j in range(random.randint(15, 340)): + string = '' + for i in range(8): + string += random.choice(str_list) print(string) # 输出随机四位hex \ No newline at end of file diff --git a/makefile b/makefile index 9ea25c3e..0dfcab14 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,7 @@ main: echo Please run a build command, such as "make clickmouse". clickmouse: gui/main.py - $(command) --file-description="Clickmouse" --product-name="ClickMouse" --windows-icon-from-ico=gui/res/icons/clickmouse/icon.ico --include-data-dir=gui/res/=res/ --include-data-file=gui/key=key gui/main.py --file-version="3.3.0.23" --windows-console-mode="disable" --enable-plugin=pyside6 --include-data-file=gui/7z.exe=7z.exe --include-data-file=gui/7z.dll=7z.dll --output-dir=dist/clickmouse/ + $(command) --file-description="Clickmouse" --product-name="ClickMouse" --windows-icon-from-ico=gui/res/icons/clickmouse/icon.ico --include-data-dir=gui/res/=res/ --include-data-file=gui/key=key gui/main.py --file-version="3.3.0.23" --windows-console-mode="disable" --enable-plugin=pyside6 --include-data-file=gui/7z.exe=7z.exe --include-data-file=gui/7z.dll=7z.dll --output-dir=dist/clickmouse/ --include-qt-plugins=webview $(command) --file-description="Clickmouse uninstall" --product-name="uninstall" --windows-icon-from-ico=gui/res/icons/clickmouse/uninstall.ico --file-version="2026.06.27.1" gui/uninstall.py --enable-plugin=pyside6 --windows-console-mode="disable" --windows-uac-admin --output-dir=dist/clickmouse/ $(command) --file-description="Clickmouse IPK" --product-name="CmIPK" --windows-icon-from-ico=gui/res/icons/clickmouse/init.ico --file-version="2026.07.02.1" gui/install_pack.py --enable-plugin=pyside6 --windows-console-mode="disable" --output-dir=dist/clickmouse/ $(command) --file-description="Clickmouse repair" --product-name="CmRepair" --windows-icon-from-ico=gui/res/icons/clickmouse/repair.ico --file-version="2026.05.23.1" gui/repair.py --enable-plugin=pyside6 --windows-console-mode="disable" --windows-uac-admin --output-dir=dist/clickmouse/ diff --git a/merge-distFolders.ps1 b/merge-distFolders.ps1 index 1f8de145..c79798a5 100644 --- a/merge-distFolders.ps1 +++ b/merge-distFolders.ps1 @@ -5,8 +5,8 @@ ɨ赱ǰĿ¼ .dist βļС - ͨ .dist ļУֱļ/ļУļƶ test ļУ ĿѴͬĿƶɺ .dist ļΪգɾ - - Ϊ 2.dist ļУΪ 2 ƶ test ļУ - ĿѴΪ 2 ļ + - Ϊ updater.dist ļУΪ updater ƶ test ļУ + ĿѴΪ updater ļ .NOTES ˽űʼմ PowerShell ĵǰĿ¼ .EXAMPLE @@ -33,6 +33,13 @@ $allAllowdNotNoneFolder = $false # ȡ .dist ļУļУ $distFolders = Get-ChildItem -Path $SourcePath -Directory -Force | Where-Object { $_.Name -like "*.dist" } +# ȼmain.dist ȣǰͨ .dist ֮updater.dist ⴦ +$distFolders = $distFolders | Sort-Object { + if ($_.Name -eq "main.dist") { 0 } + elseif ($_.Name -eq "updater.dist") { 2 } + else { 1 } +} + if ($distFolders.Count -eq 0) { Write-Warning "No .dist folders found." exit 0 @@ -44,15 +51,15 @@ if (-not (Test-Path -Path $targetDir)) { Write-Host "Created target folder: $targetDir" } else { Write-Host "Target folder already exists: $targetDir" - $choice = Read-Host "Do you want to force delete it? (Y/N, default is N)" + $choice = Read-Host "Do you want to force delete it? (Y/N, default is Y)" $choice = $choice.Trim().ToUpper() - if ($choice -eq "Y") { + if ($choice -eq "N" ) { + Write-Warning "You refused to delete the target folder, which may cause merge conflicts, and the software cannot run." + } else { Remove-Item -Path $targetDir -Recurse -Force Write-Host "Deleted target folder: $targetDir" New-Item -Path $targetDir -ItemType Directory | Out-Null Write-Host "Created target folder: $targetDir" - } else { - Write-Warning "You refused to delete the target folder, which may cause merge conflicts, and the software cannot run." } } diff --git a/setup.py b/setup.py index d42276f6..780b8266 100644 --- a/setup.py +++ b/setup.py @@ -6,19 +6,34 @@ # 以下为setup.py文件内容 # 导入setuptools模块 import setuptools -from Cython.Build import cythonize +import sys + +args = sys.argv[1:] + [''] + +if "build_ext" in args: + from Cython.Build import cythonize + + ext_modules = cythonize(["src/clickmouse/__init__.py"]) # 编译main.py为.pyd文件 +else: + ext_modules = None # 不需要编译main.py为.pyd文件 + +with open("README.md", "r", encoding="utf-8") as f: + markdown = f.read() + +with open("README-zh_CN.md", "r", encoding="utf-8") as f: + markdown += '\n\n' + f.read() # 定义setup函数 setuptools.setup( name="ClickMouse", # 包名 - version="3.3.0", # 版本号 + version="3.3.0alpha6", # 版本号 package_dir={"": "src"}, packages=setuptools.find_packages(where="src"), author="xystudio", # 作者 author_email="173288240@qq.com", # 作者邮箱 description="基于Python的鼠标连点工具", # 包描述 url="https://github.com/xystudiocode/pyClickMouse", # 包的github地址 - long_description=open("README-py.md", "r", encoding="utf-8").read(), # 包的readme文件 + long_description=markdown, # 包的readme文件 long_description_content_type="text/markdown", # 指定readme文件格式为markdown classifiers=[ # 包的分类列表 "Programming Language :: Python :: 3", # python版本 @@ -26,13 +41,13 @@ "Operating System :: OS Independent",# 系统 ], keywords=["mouse", "click", "automation", "clickmouse"], # 包的关键字列表 - python_requires='>=3.8', # python版本要求 - install_requires=['pyautogui'], # 依赖的包列表 + python_requires='>=3.10', # python版本要求 + install_requires=['pyautogui', 'PySide6>=6.10.0', 'nuitka>=4'], # 依赖的包列表 entry_points={ # 脚本入口 "console_scripts": [ "clickmouse = clickmouse.__main__:main", "clickmouse-apiCli = clickmouse_api.__main__:main" ] }, - ext_modules=cythonize(["src/clickmouse/__init__.py"]), # 编译main.py为.pyd文件 + ext_modules=ext_modules, # 编译main.py为.pyd文件 ) diff --git a/src/clickmouse_api/GUI/__init__.py b/src/clickmouse_api/GUI/__init__.py index 1c98b718..e69de29b 100644 --- a/src/clickmouse_api/GUI/__init__.py +++ b/src/clickmouse_api/GUI/__init__.py @@ -1,5 +0,0 @@ -from PySide6.QtWidgets import * -from PySide6.QtCore import * -from PySide6.QtGui import * -import sys -from clickmouse_API.GUI import styles diff --git a/src/clickmouse_api/GUI/styles.py b/src/clickmouse_api/GUI/styles.py index ce3b00da..e69de29b 100644 --- a/src/clickmouse_api/GUI/styles.py +++ b/src/clickmouse_api/GUI/styles.py @@ -1,311 +0,0 @@ -import wx - -class Style: - DEFAULT = 0b1 - OK = 0b10 - CANCEL = 0b100 - YES = 0b1000 - NO = 0b10000 - YESNO = YES | NO - OKCANCEL = OK | CANCEL - YESNOCANCEL = YES | NO | CANCEL - INFO = 0b100000 - QUESTION = 0b1000000 - WARNING = 0b10000000 - ERROR = 0b100000000 - - -class MoreButtonDialog(wx.Dialog): - def __init__(self, parent, title:str, message:str, buttons:list, msgbox_style=Style.DEFAULT, window_style=wx.DEFAULT_DIALOG_STYLE): - super().__init__(parent, title=title, style=window_style, size=(300, 300)) - - self.msgbox_style = msgbox_style - sizer = wx.BoxSizer(wx.VERTICAL) - btn_sizer = wx.BoxSizer(wx.HORIZONTAL) - title_sizer = wx.BoxSizer(wx.HORIZONTAL) - icon = self.parse_box_icon() - if icon is not None: - title_sizer.Add(wx.StaticBitmap(self, bitmap=wx.ArtProvider.GetBitmap(icon, wx.ART_MESSAGE_BOX, (32, 32))), 0, wx.ALL, 15) - else: - title_sizer.AddSpacer(15) - title_sizer.Add(wx.StaticText(self, label=message), 0, wx.ALL, 15) - - self.button_text_list = buttons.copy() - self.buttons_text_list = self.parse_button_style() - self.buttons = [] - for i, btn_text in enumerate(self.buttons_text_list): - btn = wx.Button(self, wx.ID_ANY, btn_text) - btn.Bind(wx.EVT_BUTTON, lambda evt, idx=i: self.EndModal(idx)) - btn_sizer.Add(btn) - self.buttons.append(btn) - - sizer.Add(title_sizer, 0, wx.EXPAND | wx.ALL, 5) - sizer.Add(btn_sizer, 0, wx.EXPAND | wx.ALL, 5) - self.SetSizer(sizer) - self.Fit() - - def parse_box_icon(self): - if self.msgbox_style & Style.INFO: - return wx.ART_INFORMATION - elif self.msgbox_style & Style.QUESTION: - return wx.ART_QUESTION - elif self.msgbox_style & Style.WARNING: - return wx.ART_WARNING - elif self.msgbox_style & Style.ERROR: - return wx.ART_ERROR - else: - return None - - def parse_button_style(self): - buttons = self.button_text_list.copy() - if self.msgbox_style & Style.YES: - buttons.append("是") - if self.msgbox_style & Style.NO: - buttons.append("否") - if self.msgbox_style & Style.CANCEL: - buttons.append("取消") - if self.msgbox_style & Style.OK: - buttons.append("确定") - return buttons - -class SelectUI(wx.Dialog): - def __init__(self, title, size, parent=None, **kwargs): - super().__init__(parent, title=title, size=size, **kwargs) - self.setting_font = wx.Font(wx.FontInfo().FaceName('Microsoft YaHei UI').Bold(False)) - - # 初始化主界面 - self.main_panel = wx.Panel(self) - - # 使用布局管理器 - self.main_sizer = wx.BoxSizer(wx.VERTICAL) - setting_sizer = wx.BoxSizer(wx.HORIZONTAL) - - # 创建左侧按钮面板(立即初始化sizer) - self.button_panel = wx.Panel(self.main_panel) - button_sizer = wx.BoxSizer(wx.VERTICAL) # 先创建sizer - self.button_panel.SetSizer(button_sizer) # 立即设置到面板 - # 设置按钮样式 - self.button_panel.SetWindowStyle(wx.BORDER_SIMPLE) - self.button_panel.SetBackgroundColour(wx.WHITE) - - # 创建右侧内容面板(立即初始化sizer) - self.content_panel = wx.Panel(self.main_panel) - self.content_sizer = wx.BoxSizer(wx.VERTICAL) - self.content_panel.SetSizer(self.content_sizer) - - # 初始化页面和按钮 - self.pages = [] - self.buttons = [] - self.page_titles = [] - - # 设置布局比例(左侧1:右侧5) - setting_sizer.Add(self.button_panel, 1, wx.EXPAND | wx.ALL, 5) - setting_sizer.Add(self.content_panel, 5, wx.EXPAND | wx.ALL, 5) - - self.main_sizer.Add(setting_sizer, 7, wx.EXPAND | wx.ALL, 0) - - # 应用布局 - self.main_panel.SetSizer(self.main_sizer) - - def create_pages(self): - '''创建页面内容和对应按钮''' - for index, title in enumerate(self.page_titles): - # 创建内容页面 - page = wx.Panel(self.content_panel) - self.pages.append(page) - self.content_panel.GetSizer().Add(page, 1, wx.EXPAND) - page.Hide() - - # 创建对应按钮 - btn = wx.Button(self.button_panel, label=title, size=wx.Size(70, 30)) - btn.Bind(wx.EVT_BUTTON, lambda evt, idx=index: self.switch_page(idx)) - self.buttons.append(btn) - self.button_panel.GetSizer().Add(btn, 0, wx.EXPAND | wx.ALL, 0) - - def draw_page(self, index): - '''根据索引绘制页面内容''' - pass - - def switch_page(self, index): - '''切换页面并更新按钮状态''' - # 隐藏所有页面 - for page in self.pages: - page.Hide() - - # 显示选中页面 - self.pages[index].Show() - self.draw_page(index) - - # 更新按钮样式 - for i, btn in enumerate(self.buttons): - color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_ACTIVECAPTION) if i == index else None - btn.SetBackgroundColour(color) - # 调整布局 - self.content_sizer.Layout() - -class PagesUI(wx.Frame): - '''页面UI样式''' - def __init__(self, title, size, parent=None, **kwargs): - super().__init__(parent, title=title, size=size, **kwargs) - # 初始化 - self.pages = [] - self.current_page = 0 - self.next_page = 0 - self.total_pages = 0 - - # 主面板 -<<<<<<<< HEAD:clickmouse_api/clickmouse_API/GUI/styles.py - main_panel = wx.Panel(self) - main_sizer = wx.BoxSizer(wx.VERTICAL) - - # 创建内容面板容器 - self.content_panel = wx.Panel(main_panel) -======== - self.main_panel = wx.Panel(self) - self.main_sizer = wx.BoxSizer(wx.VERTICAL) - - # 创建内容面板容器 - self.content_panel = wx.Panel(self.main_panel) ->>>>>>>> main:Gui/uiStyles.py - self.content_sizer = wx.BoxSizer(wx.VERTICAL) - self.content_panel.SetSizer(self.content_sizer) - - # 创建按钮面板 -<<<<<<<< HEAD:clickmouse_api/clickmouse_API/GUI/styles.py - btn_panel = wx.Panel(main_panel) - - # 创建按钮 - self.btn_prev = wx.Button(btn_panel, label='上一步', pos = (0,5)) - self.btn_next = wx.Button(btn_panel, label='下一步', pos = (100, 5)) - self.btn_cancel = wx.Button(btn_panel, label='取消', pos = (200, 5)) - self.btn_exit = wx.Button(btn_panel, label='退出', pos = (200, 5)) - self.btn_exit.Hide() - - # 定义页面id - self.init_pages(['a', 'b', 'c']) - - # 创建页面内容 - self.create_pages() - - # 主布局调整 - main_sizer.Add(self.content_panel, 5, wx.EXPAND) - main_sizer.Add(btn_panel, 1, wx.ALIGN_RIGHT | wx.BOTTOM, 10) - main_panel.SetSizer(main_sizer) -======== - self.btn_panel = wx.Panel(self.main_panel) - - # 创建按钮 - self.btn_prev = wx.Button(self.btn_panel, label='上一步', pos = (0,5)) - self.btn_next = wx.Button(self.btn_panel, label='下一步', pos = (100, 5)) - self.btn_cancel = wx.Button(self.btn_panel, label='取消', pos = (200, 5)) - self.btn_exit = wx.Button(self.btn_panel, label='退出', pos = (200, 5)) - self.btn_exit.Hide() - - # 主布局调整 - self.main_panel.SetSizer(self.main_sizer) ->>>>>>>> main:Gui/uiStyles.py - - # 绑定事件 - self.btn_prev.Bind(wx.EVT_BUTTON, self.on_prev) - self.btn_next.Bind(wx.EVT_BUTTON, self.on_next) - self.btn_cancel.Bind(wx.EVT_BUTTON, self.on_close) - self.btn_exit.Bind(wx.EVT_BUTTON, self.on_close) -<<<<<<<< HEAD:clickmouse_api/clickmouse_API/GUI/styles.py - - self.update_buttons() - self.update_page(0) - - self.Bind(wx.EVT_CLOSE, self.on_close) - - def init_pages(self, varible_name: list): - '''初始化值''' - for i in varible_name: - self.__dict__[i] = self.new_page() - - def create_pages(self): - for i in range(self.total_pages): - panel = wx.Panel(self.content_panel) - panel.Hide() - self.content_sizer.Add(panel, 1, wx.EXPAND) # 将页面加入Sizer - self.pages.append(panel) -======== - - self.Bind(wx.EVT_CLOSE, self.on_close) - - def init_show(self): - """初始化显示框架结构""" - self.content = self.main_sizer.Add(self.content_panel, 5, wx.EXPAND) - self.btn = self.main_sizer.Add(self.btn_panel, 1, wx.ALIGN_RIGHT | wx.BOTTOM, 10) - - def init_pages(self, varible_name: list): - '''初始化页面值''' - for i in varible_name: - self.__dict__[i] = self.new_page() - - def draw_page(self, index): - '''根据索引绘制页面内容''' - pass - - def create_pages(self): - """创建显示器页面""" - for i in range(self.total_pages): - self.panel = wx.Panel(self.content_panel) - self.draw_page(i) - self.panel.Hide() - self.content_sizer.Add(self.panel, 1, wx.EXPAND) # 将页面加入Sizer - self.pages.append(self.panel) ->>>>>>>> main:Gui/uiStyles.py - - def new_page(self): - '''创建新页面''' - self.total_pages += 1 - self.next_page += 1 - return self.total_pages - 1 - - def update_buttons(self): -<<<<<<<< HEAD:clickmouse_api/clickmouse_API/GUI/styles.py - '''更新按钮状态''' -======== - '''更新按钮状态,如果有按钮显示操作则重载此函数''' ->>>>>>>> main:Gui/uiStyles.py - if self.current_page >= self.total_pages - 1: - self.btn_prev.Hide() - self.btn_next.Hide() - self.btn_cancel.Hide() - self.btn_exit.Show() - else: - self.btn_next.Show() - self.btn_cancel.Show() - self.btn_exit.Hide() - if self.current_page > 0: - self.btn_prev.Show() - else: - self.btn_prev.Hide() - - def on_prev(self, event): - '''上一步按钮''' - if self.current_page > 0: - self.update_page(self.current_page - 1) - - def on_next(self, event): - '''下一步按钮''' - if self.current_page < self.total_pages - 1: - self.update_page(self.current_page + 1) - - def update_page(self, page_index): - '''更新页面''' - self.pages[self.current_page].Hide() - self.current_page = page_index - self.pages[self.current_page].Show() - self.update_buttons() - - def on_close(self, event): - '''关闭窗口''' - self.Destroy() - -if __name__ == '__main__': - app = wx.App() - frame = PagesUI('test', (300, 200)) - - frame.Show() - app.MainLoop() \ No newline at end of file diff --git a/src/clickmouse_api/__init__.py b/src/clickmouse_api/__init__.py index 44c1ae0c..e69de29b 100644 --- a/src/clickmouse_api/__init__.py +++ b/src/clickmouse_api/__init__.py @@ -1,40 +0,0 @@ -# clickmouse_API开发工具 存储了一些本软件中,常用的的函数和类。 - -import winreg - -init_datas = {} - -def check_clickmouse_installed(): - software_reg_key = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\clickMouse' - try: - with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, software_reg_key, 0, winreg.KEY_READ): - pass - except: - raise UserWarning('ClickMouse未安装!请前往https://www.github.com/xystudio889/pyClickMouse/releases下载安装.') - -check_clickmouse_installed() - -from clickmouse_API import GUI -from clickmouse_API.packageParser import packages -import os - -__version__ = '1.0.1' -__author__ = 'xystudio' - -def reloadData(): - ''' - 重新加载数据 - ''' - pass - -def init(dev_path=None, **kwargs): - global init_datas - - if dev_path is not None: - init_datas['in_dev'] = os.path.exists(dev_path) - - for k, v in kwargs.items(): - if v is not None: - init_datas[k] = v - - reloadData() \ No newline at end of file diff --git a/src/clickmouse_api/packageParser/__init__.py b/src/clickmouse_api/packageParser/__init__.py index ea5ff04f..e69de29b 100644 --- a/src/clickmouse_api/packageParser/__init__.py +++ b/src/clickmouse_api/packageParser/__init__.py @@ -1,12 +0,0 @@ -import os -import json - -# 判断扩展包生命文件合法 -if not(os.path.exists('packages.json')): - raise ImportError('clickmouse扩展包声明文件packages.json未设置') - -try: - with open('packages.json', 'r', encoding='utf-8') as f: - packages = json.load(f) -except json.JSONDecodeError: - raise ImportError('clickmouse扩展包声明文件packages.json格式错误') \ No newline at end of file