Python引入控制台选择菜单后Tkinter保存弹窗无法弹出问题求助
修复方案
以下是修复后可正常运行的完整代码:
import time import sys from tkinter import * from tkinter import filedialog as fd # 全局变量直接在模块层定义即可,不需要加global关键字 OU = "" tempdir = "" fs = "" def menu(): # 改用循环实现菜单,避免递归调用导致的栈溢出风险 while True: print("[1] Number 1") print("[2] Number 2") print("[0] Exit") # 新增异常捕获,避免用户输入非数字时直接崩溃 try: ou_option = int(input("Enter a number: ")) except ValueError: print("Invalid input, please enter a number. Try again...") continue # 函数内部修改全局变量需要声明global global OU if ou_option == 1: print("Number 1 selected") OU = "Number1" break elif ou_option == 2: print("Number 2 selected") OU = "Number2" break elif ou_option == 0: print("Exiting") time.sleep(1) sys.exit() else: print("Invalid number. Try again...") def save_forms(): tk2 = Tk() tk2.withdraw() # 核心修复:将窗口设为置顶,保证弹窗不会被终端或其他窗口遮挡 tk2.attributes('-topmost', True) fs = fd.askdirectory(title='Select output folder') if not fs: print('User Cancelled') time.sleep(1) sys.exit() else: print(f'Saving to {fs}...') # 销毁Tk实例,避免残留后台进程 tk2.destroy() menu() print("Saving Form") save_forms()
问题说明
- 弹窗不显示的核心原因:执行完终端菜单的输入操作后,系统焦点停留在终端窗口,默认生成的tkinter弹窗没有置顶属性,会直接隐藏在其他窗口后方,看起来就像没有弹出。新增
tk2.attributes('-topmost', True)配置后,即可强制弹窗显示在最上层。 - 原代码全局变量写法错误:
global关键字只能在函数内部使用,用来声明当前函数需要修改模块层的全局变量,直接写在模块顶层没有任何作用。 - 原菜单递归实现存在风险:如果用户连续输入错误选项,递归调用层数过深会触发栈溢出,改用while循环实现逻辑更稳定。
- 补充了输入异常处理:原代码如果用户输入非数字内容,
int(input())会直接抛出异常导致程序崩溃,新增try-except捕获逻辑可以避免这个问题。
内容的提问来源于stack exchange,提问作者FullMetalJumper
相关产品推荐
相关产品推荐

