python Tkinter故障-未定义名称框架

hgb9j2n6  于 2022-12-28  发布在  Python
关注(0)|答案(5)|浏览(138)
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:\Users\omer\Desktop\test.py", line 3, in <module>
    class Application(Frame):
NameError: name 'Frame' is not defined

我在Python方面完全是个新手,还在学习中,所以任何帮助都将不胜感激。

ckx4rj1h

ckx4rj1h1#

FrameTkButton都位于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()

这要简短得多。

pkbketx9

pkbketx92#

您需要导入FrameButtonTk
您可以从Tkinter显式导入所有这些文件:

from Tkinter import Frame, Button, Tk

或导入Tkinter(即not a good thing to do)中的所有内容:

from Tkinter import *

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

class Application(Tkinter.Frame):

更好的方法是以一种通用的方式导入tkinter,它对python2和python3都有效:

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)
bweufnob

bweufnob3#

您必须导入Frame才能像现在这样使用它。目前您已经导入了Tkinter,但这并不能给予您以您使用它们的方式访问FrameButtonTk。但您需要执行以下操作:

from Tkinter import Frame


from Tkinter import *(* 在本例中表示“全部”,但在仅使用少数模块时不需要)
或者,您可以保留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

3qpi33ja

3qpi33ja4#

好吧,这是有点晚,但对于有同样错误的人,请确保文件夹中没有tkinter.py文件。

uinbv5nw

uinbv5nw5#

我也有同样的错误。我的问题是我有一个名为tkinter.py的文件,它覆盖了内置文件tkinter。所以为了修复它,我把文件名改为其他文件。

相关问题