运行Tkinter程序遇AttributeError:class Tk has no attribute 'Frame'求助
解决Tkinter报错:AttributeError: class Tk has no attribute 'Frame'
嘿,我来帮你搞定这个问题!你遇到的这个错误通常是由几个常见的小问题导致的,咱们一步步来排查:
第一种可能:Python版本的导入差异
如果你是在Python 3环境下跑这段代码,问题根源在于Tkinter模块的名称变化——Python 3里标准库的Tkinter是小写的tkinter,而不是Python 2里的大写Tkinter。你用import Tkinter as Tk在Python3中要么导入失败,要么导入的是不兼容的兼容包,自然找不到Frame属性。
对应解决办法(适配Python3):
把导入语句改成小写的tkinter,顺便建议用小写别名tk,避免和Tk类混淆:
import tkinter as tk class Application(tk.Frame): def __init__(self, master=None): tk.Frame.__init__(self, master) self.grid() self.createWidgets() def createWidgets(self): self.quitButton = tk.Button(self, text='Quit', command=self.quit) self.quitButton.grid() app = Application() app.master.title('Sample application') app.mainloop()
第二种可能:脚本文件名和标准库重名了
如果你的脚本文件名叫Tkinter.py或者tkinter.py,Python在导入模块时会优先加载你自己的脚本,而不是系统自带的标准库Tkinter模块。这就导致你导入的Tk其实是你自己的空脚本,根本没有Frame这个属性。
对应解决办法:
- 把你的脚本改名成别的,比如
tk_sample_app.py就行 - 删掉当前目录下的
Tkinter.pyc文件或者__pycache__文件夹(这些是Python生成的缓存文件,会干扰正确导入)
第三种可能:混淆了Tkinter模块和Tk类
虽然你的代码看起来是对的,但如果不小心用了错误的导入方式(比如from Tkinter import Tk),就会把Tk类当成模块来用,这时候调用Tk.Frame肯定会报错——因为Tk是窗口类,不是模块,没有Frame这个属性。如果是这种情况,你可以调整导入方式:
对应解决办法(适配Python2):
如果确实是在Python2环境下,要么保持原导入方式,要么明确导入需要的类:
from Tkinter import Tk, Frame, Button class Application(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.grid() self.createWidgets() def createWidgets(self): self.quitButton = Button(self, text='Quit', command=self.quit) self.quitButton.grid() app = Application(Tk()) # 这里显式传入Tk实例作为主窗口 app.master.title('Sample application') app.mainloop()
另外补充一句:你原代码里app = Application()没传master参数,Tkinter会自动创建一个Tk实例当主窗口,这部分是没问题的,不用太担心~
内容的提问来源于stack exchange,提问作者John Finch
相关产品推荐
相关产品推荐

