2016-07-02 6 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をマスター/親としてウィジェットに渡しています。

例: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) 

を、すべてのWidget年代から継承BaseWidgetクラスをチェックしてください。

self.tk = master.tk 

あなたは基本ルートウィンドウの属性tk、このセットのすべての子供を持っているmasterのTK属性であることを属性tkTk()しているがあります。これは、次の行が含まれています。ネストされたウィジェットについては、ウィジェットの親が別のウィジェットである可能性があるので、もちろんルートウィンドウである必要はありません。

+1

ありがとう!それは今何の誤りもなく走ります、そして、私は私の頭を包み込むためにかなりたくさんあると思います。しかし、私は今テキストやボタン、何のアイデアなしの空白のウィンドウが表示されますか? – momo

+1

'class ClsName(tk.Frame):...'メソッドに変更した場合は、/ gridをルートウィンドウにパックする必要があります。例えばクラス – Pythonista

+1

の中で 'self.pack()/ grid()'を実行してpack()を終了させることができます。再度、感謝します。 – momo

関連する問題