2017-11-05 27 views
-2
def setAlarm(): 
    X = 5+5 
    frame2.tkraise() 
    print X 

app = Tk() 

hour = IntVar() 
minute = IntVar() 
period = StringVar() 
hour.set(None) 
minute.set(None) 
period.set(None) 
frame1 = Frame(app) #main frame 
frame2 = Frame(app) #hour frame 
frame3 = Frame(app) #minutes frame 
frame4 = Frame(app) #period frame 
frame5 = Frame(app) #something frame 
    for frame in (frame1, frame2, frame3, frame4, frame5): 
     frame.grid(row=10, column=10, sticky='news') # sets frame layout 

setAlarm = Button(frame1, text = "Set Alarm", command = lambda:setAlarm()).pack() 

フレーム1にボタンがあります。これは、フレーム2を表示するはずですが、ボタンをクリックしても何も起こりません。 frame2を前面に持ってくるsetAlarm()を呼び出すべきではありませんか?代わりに私はこのエラーを取得します。ボタンを押したときにコマンドが実行されない

File "C:/Users/Jeffrey/PycharmProjects/untitled/Graphical User 
Interface.py", line 60, in <lambda> 
    setAlarm = Button(frame1, text = "Set Alarm", command = 
lambda:setAlarm()).pack() 
TypeError: 'NoneType' object is not callable 

答えて

1

あなたはsetAlarm関数を定義が、その後、すぐにこの行がNonepack()戻りNone)と

setAlarm = Button(frame1, text = "Set Alarm", command = lambda:setAlarm()).pack()

を実行するときに、それを上書きします。

この再割り当てをsetAlarmにする必要はありません。

実際には、lambdaは必要ありません。

Button(frame1, text="Set Alarm", command=setAlarm).pack()


さらなる説明を

あなたのコードがこれに相当します:あなたはすでにsetAlarmはとてもあなたにもそれを直接使用することがあります定義されたとの結果

def foo(): 
    print('foo') 

bar = lambda: foo() 

foo = None 

bar() 

同じエラー:

bar = lambda: foo() 
TypeError: 'NoneType' object is not callable 

が実行されるまでには、fooはすでにNoneです。

0

setAlarmボタンのはcommandには必要ありません。

command = setAlarmは、関数を呼び出してはなりません(括弧を削除してください)。

そのボタンの名前を付ける必要はなく、確かにsetAlarm機能をシャドーイングしないでください。あなたがそれに名前をつけてそれを割り当てたいのであれば、それを同じ行に詰めてはならない。 packメソッドはNoneを返します。

あなたはgrid

from tkinter import * 

def setAlarm2(): 
    X = 5 + 5 
    frame2.tkraise() 
    print(X) 

app = Tk() 

hour = IntVar() 
minute = IntVar() 
period = StringVar() 
hour.set(None) 
minute.set(None) 
period.set(None) 
frame1 = Frame(app) #main frame 
frame2 = Frame(app) #hour frame 
frame3 = Frame(app) #minutes frame 
frame4 = Frame(app) #period frame 
frame5 = Frame(app) #something frame 

frames = (frame1, frame2, frame3, frame4, frame5) 

for row, frame in enumerate(frames): 
    frame.grid(row=row, column=0, sticky='news') # sets frame layout 

Button(frame1, text = "Set Alarm", command = setAlarm2).pack() 

app.mainloop() 
に同じ場所にあるすべての5つのフレームをスタッシュました
関連する問題