AttributeError: object has no attribute 'tk'

AttributeError: object has no attribute 'tk'

我已经搜索了很多,但我找不到解决这个问题的方法。我正在尝试使用 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()

这是我得到的错误:

Traceback (most recent call last):
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'

我试着查看库文件以了解问题所在,但作为一个初学者,我不太了解。对问题所在和原因的一些解释会很有帮助。

您正在将 self 作为主/parent 传递给您的小部件。

例如 - Entry(self, ...) 但是,您的 class 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, ....)

如果这令人困惑,那么这里有一个很好的 answer

既然你提到了 source code.....

看看Tk()class。其中包含以下行:

self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) 

现在,查看所有 Widget 继承自的 BaseWidget class。这包含以下行:

self.tk = master.tk 

你有你的基础根 window Tk() 具有属性 tk 并且此集合的每个 child 的属性 tkmaster 的 tk 属性。对于嵌套的小部件依此类推,因为小部件的 parent 可能只是另一个小部件,所以它当然不必是根 window。