属性错误:对象没有'tk'属性。

4

我已经搜索了很多,但是我找不到解决方法。我正在尝试使用tkinter创建一个注册表单,稍后我将连接到数据库。这是代码:

from Tkinter import *


class MWindow(object):

    def __init__(self,master):

        self.frame=Frame(master)
        self.frame.pack()

        self.title= Label(self,text = "Login")
        self.title.grid(row=0,column=1)

        self.userid_label = Label(self,text ="Username: ")
        self.userid_label.grid(row=1,column=0)

        self.userid_entry= Entry(self)
        self.userid_entry.grid(row=1,column=1)

        self.password_label = Label(self,text ="Password: ")
        self.password_label.grid(row=2,column=0)

        self.password_entry= Entry(self)
        self.password_entry.grid(row=2,column=1)

        self.signin = Button (self,text = "Login",command=logging_in)
        self.signin.grid(row=5,column=1)

        self.signup = Button (self,text = "Sign Up",command=signing_up)
        self.signin.grid(row=5,column=2)

    def logging_in(self):
        pass
    def signing_up(self):
        pass

root= Tk()
root.attributes('-fullscreen',True)
root.resizable(width=False, height=False)
root.title("My Registration Form")
app=MWindow(root)
root.mainloop()

这里是我收到的错误信息:

追踪back(最近的调用):
File "form.py", line 41, in
app=MWindow(root)
File "form.py", line 11, in init
self.title= Label(self,text = "Login")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2591, in init
Widget.init(self, master, 'label', cnf, kw)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2081, in init
BaseWidget._setup(self, master, cnf)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2059, in _setup
self.tk = master.tk
AttributeError: 'MWindow' object has no attribute 'tk'

我尝试去库文件中理解出问题所在,但由于我是初学者,无法理解太多。希望能够解释其中的问题以及原因。

1个回答

3
你正在将self作为主/父窗口传递给你的小部件。
例如 - Entry(self, ...) 但是,你的类MWindow并没有继承自Tkinter小部件。
也许你想使用self.frame
如果你真的想使用self,你可以这样做:
import Tkinter as tk

...

class MWindow(tk.Frame):

   def __init__(self, master, *args, **kwargs):

       tk.Frame.__init__(self, master, *args, **kwargs)
       abutton = tk.Button(self, ....)

如果这让您感到困惑,那么这里有一个相当不错的答案
既然您提到了源代码....
看一下Tk()类。其中包含以下行:
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) 

现在,查看所有小部件都继承自的BaseWidget类。其中包含以下行:
self.tk = master.tk 

你有一个基本的根窗口 Tk(),它具有属性 tk,每个子窗口都将其属性 tk 设置为该父窗口的 master 的 tk 属性。嵌套小部件也是如此,因为小部件的父级可能只是另一个小部件,当然不一定是根窗口。

1
非常感谢!现在它可以正常运行了,我认为我需要花费很多时间来理解它。但是现在我只能看到一个空白窗口,没有文本或按钮,你有什么想法吗? - momo
1
如果你改用 class ClsName(tk.Frame): ... 的方法,那么你需要将其打包/网格化到根窗口中。例如:root = tk.Tk() app = MWindow(root) app.pack() 或者你可以在类中使用 self.pack()/grid() - Pythonista
1
啊..忘记加pack()了。再次感谢。 - momo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接