将Python 2.7 Tkinter应用迁移至Python3时文件对话框报错求助
解决文件对话框的
NameError问题 你的错误原因很明确:你导入了tkinter.filedialog模块,但调用时直接用了filedialog,Python找不到这个未绑定的名称。这里有两种简单的修正方式:
方式1:使用完整模块路径调用
保持现有导入语句,给对话框调用加上模块前缀即可:
def ChangeCWD(self): #CWD为当前工作目录 root = tkinter.Tk() root.withdraw() # 加上tkinter.前缀,匹配你的导入方式 directory = tkinter.filedialog.askdirectory( ... ) # 注意:下面两行完全多余,会创建新窗口并阻塞应用,直接删掉 # root = Tk() # root.mainloop()
方式2:单独导入filedialog对象
修改导入语句,直接从tkinter中导入filedialog,这样就能直接调用了:
from tkinter import * import tkinter # 新增这行,单独导入filedialog from tkinter import filedialog class Window(Frame): #... 其他功能代码 ... def ChangeCWD(self): #CWD为当前工作目录 root = tkinter.Tk() root.withdraw() directory = filedialog.askdirectory( ... ) # 同样删掉多余的root = Tk()和root.mainloop()
额外提醒:你的ChangeCWD函数最后两行是完全没必要的——主程序已经有一个正在运行的Tk实例了,重复创建新窗口并调用mainloop()会导致应用卡住,删掉后对话框关闭会自动回到主应用。
关于Tkinter导入与调用的清晰规则
网上资料混乱主要是因为Tkinter有多种导入方式,每种对应不同的调用规则,我给你整理成易懂的场景:
1. 完整导入tkinter模块(大型项目推荐,避免名称冲突)
import tkinter
- 所有组件/子模块调用都要加
tkinter.前缀:- 创建主窗口:
root = tkinter.Tk() - 创建按钮:
btn = tkinter.Button(root, text="点击") - 调用文件对话框:
tkinter.filedialog.askdirectory()
- 创建主窗口:
2. 导入tkinter并设置别名(简化输入)
import tkinter as tk
- 用别名代替模块名,更简洁:
root = tk.Tk()btn = tk.Button(root, text="点击")tk.filedialog.askdirectory()
3. 从tkinter导入特定对象(小型脚本适用,减少前缀)
from tkinter import Tk, Button, filedialog
- 导入的对象可直接使用,无需前缀:
root = Tk()btn = Button(root, text="点击")filedialog.askdirectory()
4. 星号导入(不推荐,易引发名称冲突)
from tkinter import *
- 大部分核心组件(如Tk、Button、Label)可直接调用,但子模块(如filedialog、messagebox)仍需通过
tkinter.前缀调用——因为星号导入只导入tkinter顶层对象,不会包含子模块:root = Tk()(可直接用)tkinter.filedialog.askdirectory()(必须加前缀)
核心总结:filedialog、messagebox这类子模块不属于tkinter的顶层对象,不管用哪种导入方式,要么通过完整模块路径调用,要么单独导入该子模块。
内容的提问来源于stack exchange,提问作者Puffin
相关产品推荐
相关产品推荐

