You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:17:15