如何阻止PySimpleGUI点击日历按钮时window.read()触发输入框清空?
解决PySimpleGUI日历按钮触发输入框意外清空的问题
问题根源在于do_not_clear=False会让PySimpleGUI在每次window.read()返回后自动清空输入组件,而日历按钮弹出选择窗口时会触发一次额外的read(),导致输入内容被意外清空。要保留添加任务时的清空功能,同时避免日历操作的误清空,最直接的方法是放弃自动清空,改为手动控制清空时机。
具体实现步骤
- 移除所有输入组件的
do_not_clear=False设置(PySimpleGUI输入组件默认do_not_clear=True,无需显式声明) - 仅在点击「Add task」按钮时,手动调用组件的
update()方法清空/重置输入内容
修改后的示例代码
import PySimpleGUI as sg # 构建界面布局 layout = [ [sg.Text('任务名称'), sg.Input(key='-TASK_NAME-')], [sg.Text('优先级'), sg.Slider(range=(1, 5), default_value=3, orientation='h', key='-PRIORITY-')], [sg.Text('任务描述'), sg.Multiline(key='-DESCRIPTION-')], [sg.CalendarButton('选择日期', target='-DATE-', key='-CALENDAR-'), sg.Input(key='-DATE-', disabled=True)], [sg.Button('Add task'), sg.Button('退出')] ] window = sg.Window('待办事项添加', layout) while True: event, values = window.read() # 关闭窗口或点击退出按钮时结束循环 if event == sg.WIN_CLOSED or event == '退出': break # 仅在点击Add task时处理任务添加并清空输入 if event == 'Add task': # 这里替换为你的任务保存逻辑(比如写入文件/数据库) print(f"新增任务:{values['-TASK_NAME-']} | 优先级:{int(values['-PRIORITY-'])} | 日期:{values['-DATE-']}") print(f"描述:{values['-DESCRIPTION-']}\n") # 手动清空/重置所有输入组件 window['-TASK_NAME-'].update('') window['-PRIORITY-'].update(3) # 重置滑块到默认优先级 window['-DESCRIPTION-'].update('') window['-DATE-'].update('') window.close()
关键说明
- 日历按钮触发的
-CALENDAR-事件只会更新日期输入框,不会触发其他输入组件的清空操作 - 所有输入内容的清空逻辑完全由你控制,仅在确认添加任务时执行,彻底避免误清空问题
内容的提问来源于stack exchange,提问作者Marko Rabrenovic
相关产品推荐
相关产品推荐

