2016-07-02 4 views
0

Я искал довольно много, но я не мог найти решение этого. Я пытаюсь создать регистрационную форму с помощью tkinter, которую позже я подключу к базе данных. Вот код:AttributeError: объект не имеет атрибута 'tk'

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'

Я пытался идти в библиотеку файлов, чтобы понять, что это неправильно, но, будучи новичком, я не могу сделать многое из этого , Некоторое объяснение того, что происходит, и почему было бы очень полезно.

ответ

1

Вы передаете self в качестве хозяина/родителя для своих виджетов.

e.g - 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, ....) 

Если это сбивает с толку, то здесь довольно хорошо answer.

Поскольку вы упомянули source code ....

Посмотрите на Tk() класса. Который содержит следующую строку:

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

Теперь проверьте BaseWidget класс, который все Widget «s наследовать. Она содержит следующую строку:

self.tk = master.tk 

У вас есть вы база корневого окна Tk(), который имеет атрибут tk и каждый ребенок этого набора это атрибут tk быть атрибутом ок master «s. Итак, и т. Д. Для вложенных виджетов, поскольку родительский элемент виджета может просто быть другим виджетами, это, конечно, не должно быть корневым окном.

+1

спасибо большое! теперь он бежит без какой-либо ошибки, и я думаю, что у меня довольно много обернуть голову. Но теперь я получаю пустое окно без текста или кнопок, любая идея? – momo

+1

Если вы изменили метод 'class ClsName (tk.Frame): ...', то вам нужно будет установить пакет/сетку в корневое окно. например - 'root = tk.Tk() app = MWindow (root) app.pack()' или вы можете сделать 'self.pack()/grid()' в классе – Pythonista

+1

ah..missed the pack(). Еще раз спасибо. – momo

Смежные вопросы