

Python3で以下のコードを入力すると "`btn_click` が定義されていない" というエラーが出ます。`btn2_click`
も同様に定義されません。

どこを変えればエラーなく動作するようになるでしょうか。

[code]

    import tkinter
    # 画面作成
    tki = tkinter.Tk()
    tki.geometry('400x200') # 画面サイズの設定
    tki.title('がちゃ') # 画面タイトルの設定
    
    # ボタンの作成
    btn  = tkinter.Button(tki, text='単発',height=2,width=20,command=btn_click) # ボタンの設定
    btn.place(x=30, y=100) #ボタン位置
    btn2 = tkinter.Button(tki, text='10',height=2,width=20,command=btn2_click) # ボタンの設定
    btn2.place(x=230, y=100) #ボタン位置
      
    def btn_click():
        import tkinter
        tki2=tkinter.Tk()
        tki2.geometry('400x200')
        tki2.title('1')
        btn3  = tkinter.Button(tki2, text='yes',height=2,width=20) # ボタンの設定
        btn4  = tkinter.Button(tki2, text='no',height=2,width=20)
        btn3.place(x=30,y=100)
        btn4.place(x=230,y=100)
    
    def btn2_click():
        import tkinter
        tki3=tkinter.Tk()
        tki3.geometry('400x200')
        tki3.title('10')
        btn5  = tkinter.Button(tki2, text='yes',height=2,width=20) # ボタンの設定
        btn6  = tkinter.Button(tki2, text='no',height=2,width=20)
        btn5.place(x=30,y=100)
        btn6.place(x=230,y=100)
    
    # 画面をそのまま表示
    tki.mainloop()
    
[/code]


CC BY-SA 4.0
2022-11-21T03:43:05.173
92335
2022-11-21T06:20:09.660
2022-11-21T04:56:08.187
3060
55520
question
python python3
コードを実行すると btn_click が定義されていないというエラーが出る


コメント指摘の通り、`btn_click`を定義するよりも前の行で`btn_click`を呼び出すと、下記のように[`NameError`](https://docs.python.org/ja/3/library/exceptions.html#NameError)が発生します。

[code]

    Exception has occurred: NameError
    name 'btn_click' is not defined
    
[/code]

ちなみに`btn5 = tkinter.Button(tki2,
text='yes',height=2,width=20)`でも`NameError`が発生します。  
これは`btn2_click`関数のスコープ内で`tki2`が定義されていないことが原因です。  
`tki3`の打ち間違いでないかご確認ください。

サンプルコードのように書き直すことで正常動作を確認しました。

**サンプルコード**

[code]

    import tkinter
    # 画面作成
    tki = tkinter.Tk()
    tki.geometry('400x200') # 画面サイズの設定
    tki.title('がちゃ') # 画面タイトルの設定
    
    def btn_click():
        import tkinter
        tki2=tkinter.Tk()
        tki2.geometry('400x200')
        tki2.title('1')
        btn3  = tkinter.Button(tki2, text='yes',height=2,width=20) # ボタンの設定
        btn4  = tkinter.Button(tki2, text='no',height=2,width=20)
        btn3.place(x=30,y=100)
        btn4.place(x=230,y=100)
    
    def btn2_click():
        import tkinter
        tki3=tkinter.Tk()
        tki3.geometry('400x200')
        tki3.title('10')
        btn5  = tkinter.Button(tki3, text='yes',height=2,width=20) # ボタンの設定
        btn6  = tkinter.Button(tki3, text='no',height=2,width=20)
        btn5.place(x=30,y=100)
        btn6.place(x=230,y=100)
    
    # ボタンの作成
    btn  = tkinter.Button(tki, text='単発',height=2,width=20,command=btn_click) # ボタンの設定
    btn.place(x=30, y=100) #ボタン位置
    btn2 = tkinter.Button(tki, text='10',height=2,width=20,command=btn2_click) # ボタンの設定
    btn2.place(x=230, y=100) #ボタン位置
    
    # 画面をそのまま表示
    tki.mainloop()
    
[/code]


CC BY-SA 4.0
2022-11-21T04:26:14.730
92338
2022-11-21T04:26:14.730
9820
92335
answer


Pythonに限らず, 変数を使用する前に参照するとたいていエラーです (特に動的型付け言語では)  
すぐそこに定義してる, としても実行時に後方参照してたらダメ

[code]

    result = hed + v * 3   #  未定義変数を扱ってるのでエラー
    
    hed = 1
    v = 2
    print(result)
    
[/code]

また, 変数ではなく関数であっても同様。関数を定義する前に参照してはいけない  
質問の `btn_click` は, 「ボタンの作成」実行時点では未定義です

[code]

    result = fn   #  関数 fn を定義前に扱うとエラー
    
[/code]

* * *

ただし, 以下の場合は少し事情が異なります

  * 関数 `fn` を **定義** する段階では `hed`,`v` はエラーではない
  * 関数 `fn` **実行** 時(呼び出し時) では, `hed`,`v` を参照しようとするので, その時点で未定義だとエラー

この場合の順序は, `fn`の定義 --> `hed`,`v` の定義 --> その後 `fn()` を呼び出しているのでエラーは発生しない

※ 本来は, `hed`,`v` は引数で与えるべきだが参照の説明のための この構造

[code]

    def fn():
        result = hed + v * 3
        return result
    
    hed = 'あ'
    v = 'は'
    print(fn())
    hed = 'え'
    v = 'へ'
    print(fn())
    
[/code]


CC BY-SA 4.0
2022-11-21T05:16:25.570
92339
2022-11-21T06:20:09.660
2022-11-21T06:20:09.660
43025
43025
92335
answer