基于LMB点击按住启动、释放停止重置的悬浮定时器问题求助
悬浮定时器问题修复方案
你的代码核心问题有两个:
- 按下左键后没有实时更新界面上的计时数值,所以看起来计时没启动
- pynput监听线程直接操作GUI元素,可能触发线程安全问题(PySimpleGUI要求所有GUI操作必须在主线程)
修正后的代码
import PySimpleGUI as sg import time from pynput import mouse sg.theme('DefaultNoMoreNagging') layout = [[sg.Text('0.0', size=(10, 1), justification='center', font=('Helvetica', 48), key='-TIMER-')]] window = sg.Window('Timer', layout, finalize=True) start_time = 0 timer_running = False def on_click(x, y, button, pressed): global start_time, timer_running if button == mouse.Button.left: if pressed: if not timer_running: start_time = time.time() timer_running = True else: # 释放左键时重置状态 timer_running = False listener = mouse.Listener(on_click=on_click) listener.start() while True: # 用timeout参数定时刷新界面,每隔100ms更新一次 event, values = window.read(timeout=100) if event == sg.WINDOW_CLOSED: listener.stop() break # 主线程中处理计时更新,避免线程安全问题 if timer_running: elapsed_time = round(time.time() - start_time, 1) window['-TIMER-'].update(f'{elapsed_time}') else: # 未计时时显示0.0 window['-TIMER-'].update('0.0') window.close()
关键改动说明
- 把GUI更新逻辑移到主循环:通过
window.read(timeout=100)让界面每隔100ms刷新一次,在主线程中计算并更新计时数值,符合PySimpleGUI的线程安全要求 - 监听线程只修改全局状态变量:释放左键时只把
timer_running设为False,不直接操作GUI - 未计时状态下强制显示0.0:确保释放左键后界面自动重置
内容的提问来源于stack exchange,提问作者Elysion
相关产品推荐
相关产品推荐

