Tkinter 问题 - 未定义名称框架


import Tkinter
class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self,master)
        self.grid()
        self.CreateWidgets()
    def CreateWidgets(self):
        self.LoginButton = Button(Self)
        self.LoginButton["text"] = "Login"
        self.LoginButton.grid()
        self.QUIT_Button = Button(self)
        self.QUIT_Button["text"] = "Quit"
        self.QUIT_Button["command"] = self.quit
        self.QUIT_Button["fg"] = "red"
root = Tk()
root.title("Login")
root.geometry("500x500")
app = Application(root)
root.mainloop()

这是我一直在关注的YouTube教程:https://www.youtube.com/watch?v=YCLTv6wh3jE&index=39&list=PLB0701884E5AE1B45

这是不断发生的错误:

Traceback (most recent call last):
  File "C:UsersomerDesktoptest.py", line 3, in <module>
    class Application(Frame):
NameError: name 'Frame' is not defined

我是Python的菜鸟,仍在学习,所以任何帮助将不胜感激。

Frame TkButton 都位于 Tkinter 命名空间中。 因此,你必须让它们限定为让 Python 知道它们在哪里1

import Tkinter
class Application(Tkinter.Frame):
...
        Tkinter.Frame.__init__(self, master)
...
        self.LoginButton = Tkinter.Button(self)
...
        self.QUIT_Button = Tkinter.Button(self)
...
root = Tkinter.Tk()

或者您可以直接导入名称:

from Tkinter import Frame, Tk, Button

1如果您决定使用第一个解决方案,最好导入如下Tkinter

import Tkinter as tk

这样,代码就变成了这样:

import Tkinter as tk
class Application(Tkinter.Frame):
...
        tk.Frame.__init__(self, master)
...
        self.LoginButton = tk.Button(self)
...
        self.QUIT_Button = tk.Button(self)
...
root = tk.Tk()

这要简短得多。

你需要导入FrameButtonTk

您可以从Tkinter显式导入所有这些:

from Tkinter import Frame, Button, Tk

或者从Tkinter导入所有内容(这不是一件好事(:

from Tkinter import *

或者保持导入原样(import Tkinter(并从Tkinter命名空间获取FrameButtonTk,例如用于Frame

class Application(Tkinter.Frame):

更好的方法是以适用于 python2 和 python3 的通用方式导入 tkinter:

try:
    # Python2
    import Tkinter as tk 
except ImportError:
    # Python3
    import tkinter as tk 
class Application(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self,master)
        self.grid()
        self.CreateWidgets()
    def CreateWidgets(self):
        self.LoginButton = tk.Button(self)
        self.LoginButton["text"] = "Login"
        self.LoginButton.grid()
        self.QUIT_Button = tk.Button(self)
        self.QUIT_Button["text"] = "Quit"
        self.QUIT_Button["command"] = self.quit
        self.QUIT_Button["fg"] = "red"
root = tk.Tk()
root.title("Login")
root.geometry("500x500")
app = Application(root)
root.mainloop()

另外,您有一个错别字,替换(观看Self(:

self.LoginButton = Button(Self)

跟:

self.LoginButton = Button(self)

您必须导入Frame才能像现在一样使用它。就目前而言,您已经导入了Tkinter,但这并不能让您访问FrameButtonTk您使用它们的方式。但你要么需要做:

from Tkinter import Frame

from Tkinter import *(*在这种情况下表示"全部",尽管当仅使用几个模块时,这不是必需的(

或者你可以保持你的导入语句原样(import Tkinter (并像这样更改你的代码:

class Application(Tkinter.Frame):

self.LoginButton = Tkinter.Button(Self)

但是,我建议您这样做,您可以:

import Tkinter as tk

这样,您就可以执行tk.Frametk.Button等操作。

对于要从 Tkinter 使用的任何模块,您也需要以相同的方式导入它们。

您可以像这样执行单行导入:

from Tkinter import Tk, Frame, Button etc.

查看有关在 Python 中导入的信息:http://effbot.org/zone/import-confusion.htm

好吧,

有点晚了,但对于有相同错误的人,请确保文件夹中没有tkinter.py文件。

我也遇到了同样的错误。我的问题是我有一个名为 tkinter.py 的文件,它覆盖了内置文件tkinter。因此,为了修复它,我将文件名更改为其他名称。

最新更新