Tkinter文件夹选择对话框按钮失效:需先选中文件夹才可操作
Tkinter文件夹选择对话框在Windows10下按钮无响应,需先激活窗口才能操作
在Windows 10环境下使用Tkinter的filedialog.askdirectory时,出现对话框弹出后按钮点击无响应的问题,必须先选中窗口内的文件夹、地址栏或搜索栏激活窗口后,按钮才能正常工作。这是因为Tk根窗口初始化后直接隐藏,导致对话框没有正确获取焦点。
解决方法
在创建Tk根窗口后,添加强制获取焦点的代码,确保对话框能正常接收用户输入:
- 创建根窗口后调用
root.focus_force(),强制将焦点转移到Tk应用 - 添加
root.attributes('-topmost', True)确保窗口层级优先(即使隐藏根窗口,也能帮助对话框获得焦点) - 调用
root.update()处理初始化时的事件队列,避免焦点延迟
修改后的代码
def copy_project_template_folder(): src_folder = r'A:\Projects\000_Project Template Folder' # 获取剪贴板文本 clipboard_text = pyperclip.paste().strip() # 默认项目目录(当剪贴板内容不是有效目录时使用) ProjTargetDir = r'A:\Projects' # 检查剪贴板内容是否为有效目录 if os.path.isdir(clipboard_text): ProjTargetDir = clipboard_text # 初始化Tk根窗口并处理焦点问题 root = Tk() root.attributes('-topmost', True) # 确保窗口层级优先 root.focus_force() # 强制获取焦点 root.update() # 处理事件队列 root.withdraw() # 隐藏根窗口 # 显示文件夹选择对话框 dst_folder = filedialog.askdirectory(title='Select Destination Folder', initialdir=ProjTargetDir) if not dst_folder: root.destroy() # 销毁根窗口,避免资源残留 return # 用户取消操作 # 复制源文件夹内容到目标文件夹 for item_name in os.listdir(src_folder): item_path = os.path.join(src_folder, item_name) dst_path = os.path.join(dst_folder, item_name) if os.path.isdir(item_path): shutil.copytree(item_path, dst_path) else: shutil.copy2(item_path, dst_folder) # 显示完成通知 message = f'项目模板文件夹已成功复制到"{dst_folder}"!' toaster = ToastNotifier() toaster.show_toast('Macro Launcher', message, duration=5, threaded=True) root.destroy() # 操作完成后销毁根窗口
额外说明
- 操作完成后调用
root.destroy()可以彻底销毁Tk根窗口,避免残留的后台进程 - 如果仍有问题,可以尝试将
root.withdraw()移到askdirectory之后,但这样会短暂显示空白根窗口,不过能确保对话框焦点正常
内容的提问来源于stack exchange,提问作者silverMASH
相关产品推荐
相关产品推荐

