import PySimpleGUI as Py
import time
import os
# ======== 全局设置 ========
Py.theme('Default')
a = ' 漫息!'
b = '【'
# 图片路径定义(请确保这些路径在你电脑上真实存在)
image_path2 = "D:/software/demo/pythonProject/images/image2.png"
image_path3 = "D:/software/demo/pythonProject/images/image3.png"
image_path4 = "D:/software/demo/pythonProject/images/image4.png"
image_path5 = "D:/software/demo/pythonProject/images/image5.png"
image_path6 = "D:/software/demo/pythonProject/images/image6.png"
image_path7 = "D:/software/demo/pythonProject/images/image7.png"
image_path8 = "D:/software/demo/pythonProject/images/image8.png"
image_path9 = "D:/software/demo/pythonProject/images/image9.png"
# 检查图片是否存在
def check_image(path):
if not os.path.exists(path):
print(f"[!] 图片不存在: {path}")
return None
return path
image_path2 = check_image(image_path2)
image_path3 = check_image(image_path3)
image_path4 = check_image(image_path4)
image_path5 = check_image(image_path5)
image_path6 = check_image(image_path6)
image_path7 = check_image(image_path7)
image_path8 = check_image(image_path8)
image_path9 = check_image(image_path9)
# ======== 全局窗口变量 ========
window10 = None # 用于保存 window10 的引用
# ======== 关闭 window10 的安全函数 ========
def close_window10():
global window10
if window10:
try:
window10.close()
except Exception:
pass
window10 = None
# ======== 周期性提醒功能 ========
reminder_running = False
def run_periodic_reminder():
global reminder_running
if reminder_running:
print("[!] 提醒功能已在运行,忽略重复调用")
return
reminder_running = True
layout9 = [
[Py.Image(key='img9', filename=image_path9) if image_path9 else Py.Text("加载失败")],
[Py.Text("天", font=("华文楷体", 10), text_color='blue')],
[Py.Text("📌 周期性提醒已激活:每次取消后10秒自动重试")],
[Py.Multiline("", size=(60, 4), key='-OUTPUT-', disabled=True, autoscroll=True)],
[Py.Button('退出', key='EXIT', button_color=('#800000', 'Silver')),
Py.Text("", font=("华文楷体", 10), text_color='red')]
]
window9_position = (1795, 300)
window9 = Py.Window('', layout9, size=(460, 490), finalize=True, location=window9_position)
window9.keep_on_top_set()
next_popup_time = time.time() + 1
reminder_active = True
popup_active = False
input_popup = None
can_exit = False # 控制是否允许退出
def show_input_popup():
layout_popup = [
[Py.Text(':')],
[Py.Input(key='-INPUT-', size=(6, 1), font=("Arial", 20), focus=True),
Py.Text('或', font=("华文楷体", 16), text_color='#000000'),
Py.Text('动', font=("华文楷体", 22), text_color='red', background_color='#86A8FF')],
[Py.Button('属于', key='BELONG', button_color=('#800000', 'white'), bind_return_key=True),
Py.Push(),
Py.Button('不属于', key='NOT_BELONG', button_color=('#000000', 'white'))]
]
windowpopup_position = (1890, 680)
return Py.Window('', layout_popup, keep_on_top=True, modal=True, location=windowpopup_position, finalize=True)
try:
while True:
# 主窗口读取事件
try:
event9, values9 = window9.read(timeout=100)
except Exception as e:
if "wrapped C/C++ object has been deleted" in str(e) or "TclError" in str(e):
print("[INFO] 窗口已被系统关闭,退出提醒循环。")
break
else:
print(f"[ERROR] Unexpected error: {e}")
break
# 处理退出按钮:只有 can_exit 为 True 时才响应
if event9 == 'EXIT':
if not can_exit:
window9['-OUTPUT-'].update("⚠️ 尚未完成验证,无法退出\n", append=True)
continue
else:
close_window10()
layout10 = [
[Py.Image(key='img2', filename=image_path2) if image_path2 else Py.Text("加载失败")],
[Py.Text(a, size=(23, 200), auto_size_text=True)]
]
window10_pos = (2340, 145)
global window10
window10 = Py.Window('', layout10, size=(220, 750), location=window10_pos, finalize=True)
window10.keep_on_top_set()
break
if event9 in (None, Py.WINDOW_CLOSED):
break
now = time.time()
# 触发新弹窗
if reminder_active and not popup_active and next_popup_time and now >= next_popup_time:
popup_active = True
try:
input_popup = show_input_popup()
except Exception as e:
print(f"[Error] 无法创建弹窗: {e}")
popup_active = False
next_popup_time = now + 10
continue
# 处理 input_popup 弹窗逻辑
if input_popup:
try:
event_p, values_p = input_popup.read(timeout=100)
except Exception as e:
print(f"[Popup Error] {e}")
input_popup = None
popup_active = False
window9['-OUTPUT-'].update("⚠️ 弹窗异常关闭,60秒后重试...\n", append=True)
next_popup_time = time.time() + 60
continue
if event_p == Py.WINDOW_CLOSED or event_p is None:
try:
input_popup.close()
except Exception:
pass
input_popup = None
popup_active = False
window9['-OUTPUT-'].update("⛔ 弹窗被用户关闭,60秒后将再次提醒...\n", append=True)
next_popup_time = time.time() + 60
continue
user_input = values_p.get('-INPUT-', '').strip()
valid_number = False
try:
if user_input:
float(user_input)
valid_number = True
except ValueError:
pass
# 安全更新按钮状态
try:
input_popup['BELONG'].update(disabled=not valid_number)
except Exception:
pass # 忽略失效窗口更新
if event_p == 'BELONG' and valid_number:
try:
num = float(user_input)
formatted_num = int(num) if num.is_integer() else num
window9['-OUTPUT-'].update(f"✔️ 录入成功:{formatted_num} —— 提醒停止\n", append=True)
reminder_active = False
next_popup_time = None
can_exit = True
except Exception:
window9['-OUTPUT-'].update(f"❌ 输入处理失败:'{user_input}'\n", append=True)
next_popup_time = time.time() + 60
finally:
try:
input_popup.close()
except Exception:
pass
input_popup = None
popup_active = False
elif event_p == 'NOT_BELONG':
try:
input_popup.close()
except Exception:
pass
input_popup = None
popup_active = False
window9['-OUTPUT-'].update("⛔ 用户取消,60秒后将再次提醒...\n", append=True)
next_popup_time = time.time() + 60
finally:
try:
window9.close()
except Exception:
pass
reminder_running = False
# ======== 单次流程函数 run_single_flow ========
def run_single_flow():
input_history = []
current_text = ''
layout4 = [
[Py.Image(key='img4', filename=image_path4) if image_path4 else Py.Text("加载失败")],
[Py.Text("请在5秒内输入当前动量,之后5秒无操作将自动记录:")],
[Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), focus=True),
Py.Text("", size=(60, 1), key='-STATUS-')],
[Py.Text(":")],
[Py.Frame('', [[Py.Text("", size=(48, 15), key='-HISTORY-', relief='sunken',
background_color='white', text_color='black', font=('Courier', 15))]],
size=(590, 75), pad=10)],
[Py.Button('美边', key='MEIBIAN', button_color=('#006400', 'Silver'), disabled=True)],
[Py.Button('同向', key='TONGXIANG', button_color=('#000000', 'white'), disabled=True),
Py.Button('不符合', key='CANCEL', button_color=('#800000', 'Silver'))]
]
window4_position = (1795, 300)
window4 = Py.Window('', layout4, size=(460, 500), resizable=True, location=window4_position, finalize=True)
window4.keep_on_top_set()
last_input_time = None
while True:
event4, values4 = window4.read(timeout=100)
if event4 == Py.WINDOW_CLOSED or event4 == 'CANCEL':
window4.close()
return
raw_input = values4['-INPUT-'].strip()
changed = raw_input != current_text
current_text = raw_input
# 验证是否为有效数字
valid_number = False
try:
if current_text:
float(current_text)
valid_number = True
except ValueError:
pass
# 更新按钮状态
window4['MEIBIAN'].update(disabled=not valid_number)
window4['TONGXIANG'].update(disabled=not valid_number)
if valid_number:
window4['-STATUS-'].update(f"✅ 输入中 '{current_text}' ... 可提交")
elif current_text:
window4['-STATUS-'].update("❌ 请输入有效的数字")
else:
window4['-STATUS-'].update("")
# 自动提交逻辑
if valid_number and changed:
last_input_time = time.time()
elif valid_number and last_input_time is not None:
elapsed = time.time() - last_input_time
remaining = max(0, int(5 - elapsed + 0.9))
if remaining > 0:
window4['-STATUS-'].update(f"⏳ 还剩 {remaining} 秒自动提交...")
else:
try:
num = float(current_text)
formatted_num = int(num) if num.is_integer() else num
input_history.append(formatted_num)
history_str = ' '.join(map(str, input_history))
window4['-HISTORY-'].update(history_str)
window4['-STATUS-'].update("🎉 已自动记录!")
window4['-INPUT-'].update('')
current_text = ''
last_input_time = None
except Exception:
window4['-STATUS-'].update("❌ 提交失败")
finally:
window4['MEIBIAN'].update(disabled=True)
window4['TONGXIANG'].update(disabled=True)
# 处理按钮事件
if event4 == 'MEIBIAN' and valid_number:
close_window10()
window2.close()
window4.close()
run_periodic_reminder()
return
elif event4 == 'TONGXIANG' and valid_number:
window4.close()
_run_tongxiang_flow(input_history)
return
def _run_tongxiang_flow(input_history):
current_text = ''
layout5 = [
[Py.Image(key='img5', filename=image_path5) if image_path5 else Py.Text("加载失败")],
[Py.Text("请在5秒内输入当前动量,之后5秒无操作将自动记录:")],
[Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20)),
Py.Text("", size=(60, 1), key='-STATUS-')],
[Py.Frame('', [[Py.Text("", size=(49, 15), key='-HISTORY-', relief='sunken',
background_color='white', text_color='black', font=('Courier', 15))]],
size=(410, 50), pad=10)],
[Py.Button('进入弱', key='RUO', button_color=('#000000', 'Silver'), disabled=True),
Py.Button('进入强', key='QIANG', button_color=('#000000', 'Silver'), disabled=True)]
]
window5_position = (1795, 300)
window5 = Py.Window('', layout5, size=(460, 430), resizable=True, location=window5_position, finalize=True)
window5.keep_on_top_set()
last_input_time = None
while True:
event5, values5 = window5.read(timeout=100)
if event5 == Py.WINDOW_CLOSED:
window5.close()
return
raw_input = values5['-INPUT-'].strip()
changed = raw_input != current_text
current_text = raw_input
valid_number = False
try:
if current_text:
float(current_text)
valid_number = True
except ValueError:
pass
window5['RUO'].update(disabled=not valid_number)
window5['QIANG'].update(disabled=not valid_number)
if valid_number:
window5['-STATUS-'].update(f"✅ 输入中 '{current_text}' ... 可提交")
elif current_text:
window5['-STATUS-'].update("❌ 请输入有效的数字")
else:
window5['-STATUS-'].update("")
if valid_number and changed:
last_input_time = time.time()
if valid_number and last_input_time is not None:
elapsed = time.time() - last_input_time
if elapsed >= 5.0:
try:
num = float(current_text)
formatted_num = int(num) if num.is_integer() else num
input_history.append(formatted_num)
history_str = ' '.join(map(str, input_history))
window5['-HISTORY-'].update(history_str)
window5['-STATUS-'].update("🎉 已自动记录!")
window5['-INPUT-'].update('')
current_text = ''
last_input_time = None
except Exception:
window5['-STATUS-'].update("❌ 提交失败")
finally:
window5['RUO'].update(disabled=True)
window5['QIANG'].update(disabled=True)
if event5 == 'RUO' and valid_number:
window5.close()
_run_zhongjin_flow('RUO')
return
elif event5 == 'QIANG' and valid_number:
window5.close()
_run_zhongjin_flow('QIANG')
return
def _run_zhongjin_flow(mode):
recorded_numbers = []
title = "【中进】" if mode == 'RUO' else "出现【再"
btn_key = 'ZHONGJIN' if mode == 'RUO' else 'CHUXIAN_ZAI'
layout = [
[Py.Image(key='img6' if mode == 'RUO' else 'img7', filename=image_path6 if mode == 'RUO' else image_path7)],
[Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), do_not_clear=False)],
[Py.Button(title, key=btn_key, button_color=('#006400', 'Silver'), bind_return_key=True, disabled=True),
Py.Button('不于进', key='CLEAR_INPUT', button_color=('#800000', 'Silver'))],
[Py.HorizontalSeparator()],
[Py.Text("", size=(50, 2), key='-HISTORY-', relief='sunken',
background_color='white', text_color='black')]
]
pos_y = 300 if mode == 'RUO' else 350
window = Py.Window('', layout, size=(460, 395), location=(1795, pos_y), finalize=True)
window.keep_on_top_set()
while True:
event, values = window.read()
if event in (None, Py.WINDOW_CLOSED):
break
user_input = values['-INPUT-'].strip()
valid_number = False
try:
if user_input:
float(user_input)
valid_number = True
except ValueError:
pass
window[btn_key].update(disabled=not valid_number)
if event == btn_key and valid_number:
close_window10()
window2.close()
try:
num = float(user_input)
formatted_num = int(num) if num.is_integer() else num
recorded_numbers.append(formatted_num)
history_text = ' '.join(map(str, recorded_numbers))
window['-HISTORY-'].update(history_text)
window['-INPUT-'].update('')
except Exception:
pass
window.close()
run_periodic_reminder()
break
elif event == 'CLEAR_INPUT':
window['-INPUT-'].update('')
window.close()
# ======== 新增:_run_juezhan_flow ========
def _run_juezhan_flow():
current_text = ''
layout8 = [
[Py.Image(key='img8', filename=image_path8) if image_path8 else Py.Text("加载失败")],
[Py.Text("决战", font=("华文楷体", 13), text_color='blue')],
[Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), focus=True),
Py.Text("", size=(60, 1), key='-STATUS-')],
[Py.Frame('', [[Py.Text("", size=(48, 15), key='-HISTORY-', relief='sunken',
background_color='white', text_color='black', font=('Courier', 15))]],
size=(590, 75), pad=10)],
[Py.Button('败退', key='BUTUI', button_color=('#006400', 'Silver'), disabled=True),
Py.Button('反击', key='FANJI', button_color=('#006400', 'Silver'), disabled=True),
Py.Button('不符合', key='CANCEL', button_color=('#800000', 'Silver'))]
]
window8_position = (1795, 300)
window8 = Py.Window('', layout8, size=(460, 470), resizable=True, location=window8_position, finalize=True)
window8.keep_on_top_set()
input_history = []
last_input_time = None
while True:
event8, values8 = window8.read(timeout=100)
if event8 == Py.WINDOW_CLOSED or event8 == 'CANCEL':
window8.close()
return
raw_input = values8['-INPUT-'].strip()
changed = raw_input != current_text
current_text = raw_input
valid_number = False
try:
if current_text:
float(current_text)
valid_number = True
except ValueError:
pass
window8['BUTUI'].update(disabled=not valid_number)
window8['FANJI'].update(disabled=not valid_number)
if valid_number:
window8['-STATUS-'].update(f"✅ 输入中 '{current_text}' ... 可提交")
elif current_text:
window8['-STATUS-'].update("❌ 请输入有效的数字")
else:
window8['-STATUS-'].update("")
if valid_number and changed:
last_input_time = time.time()
if valid_number and last_input_time is not None:
elapsed = time.time() - last_input_time
if elapsed >= 5.0:
try:
num = float(current_text)
formatted_num = int(num) if num.is_integer() else num
input_history.append(formatted_num)
history_str = ' '.join(map(str, input_history))
window8['-HISTORY-'].update(history_str)
window8['-STATUS-'].update("🎉 已自动记录!")
window8['-INPUT-'].update('')
current_text = ''
last_input_time = None
except Exception:
window8['-STATUS-'].update("❌ 提交失败")
finally:
window8['BUTUI'].update(disabled=True)
window8['FANJI'].update(disabled=True)
if event8 in ('BUTUI', 'FANJI') and valid_number:
close_window10()
window2.close()
window8.close()
run_periodic_reminder()
return
# ======== 主窗口 layout1 & window1 ========
layout1 = [[Py.Button(b, button_color=('#006400', 'white'), font=("华文楷体", 12))]]
window1_position = (514, 24)
window1 = Py.Window('', layout1, size=(1532, 44), no_titlebar=True, location=window1_position, finalize=True)
window1.keep_on_top_set()
# ======== 辅助窗口 layout2 & window2 ========
layout2 = [
[Py.Image(key='img2', filename=image_path2) if image_path2 else Py.Text("加载失败")],
[Py.Text(a, size=(23, 200), auto_size_text=True)]
]
window2_position = (2340, 145)
window2 = Py.Window('', layout2, size=(220, 750), no_titlebar=True, location=window2_position, finalize=True)
window2.keep_on_top_set()
# ======== 主事件循环 ========
while True:
event1, values1 = window1.read()
if event1 == Py.WIN_CLOSED:
break
if event1 == b:
layout3 = [
[Py.Image(key='img3', filename=image_path3) if image_path3 else Py.Text("加载失败")],
[Py.Button('第1', key='TYPE1', button_color=('#006400', 'white')), Py.Push(),
Py.Button('第3', key='TYPE3', button_color=('#006400', 'white'))]
]
window3_position = (1795, 400)
window3 = Py.Window('交易类型', layout3, size=(460, 190), location=window3_position, finalize=True, keep_on_top=True)
window3.keep_on_top_set()
while True:
event3, values3 = window3.read()
if event3 == Py.WINDOW_CLOSED:
break
if event3 == 'TYPE1':
window3.close()
run_single_flow()
break
if event3 == 'TYPE3':
window3.close()
_run_juezhan_flow()
break
try:
window3.close()
except Exception:
pass
# ======== 清理资源 ========
try:
window1.close()
window2.close()
close_window10()
except Exception:
pass
在窗口中点击【中进】或者出现【再,run_periodic_reminder()不起作用