

以下のコードの `btn.configure(text="stop")` の部分でエラーが発生します。  
対処法などを知っている方がいたら教えていただけると嬉しいです。  
よろしくお願いします。

**エラーメッセージ:**

[code]

    例外が発生しました: NameError
    name 'btn' is not defined
      File "パスを隠させていただきました", in startandstop
        btn.configure(text="stop")
      File "パスを隠させていただきました", line 44, in <module>
        btn=tk.Button(text="start",font=("MSゴシック Classic","150","normal"),command=startandstop())
    
[/code]

**ソースコード:**

[code]

    import tkinter as tk
    from time import sleep
    
    h=0
    m=0
    s=0
    mode=2
    
    def time():
        if mode==1:
            if s==59:
                sleep(1)
                s=0
                if m==59:
                    sleep(1)
                    m=0
                    if h==24:
                        sleep(1)
                        h=1
                    else:
                        h=h+1
                else:
                    m=m+1
            else:
                s=s+1
            timelabel.configure(text=h-m-s)
            root.after(100,time)
    
    def startandstop():
        global mode
        if mode==1:
            mode=2
            btn.configure(text="start")
        else:
            mode=1
            btn.configure(text="stop")
    
    root=tk.Tk()
    root.geometry("300x300")
    
    timelabel=tk.Label(text=h-m-s,font=("MSゴシック Classic","150","normal"))
    timelabel.place(x=280,y=400)
    
    btn=tk.Button(text="start",font=("MSゴシック Classic","150","normal"),command=startandstop())
    btn.place(x=280,y=400)
    
    root.after(100,time)
    root.mainloop()
    
[/code]


CC BY-SA 4.0
2022-08-13T10:12:41.653
90544
2022-08-16T11:29:32.820
2022-08-13T11:34:29.297
3060
53981
question
python tkinter
pythonのtkinterで関数内のif文の挙動がおかしいです


`command=startandstop()`ではなく`command=startandstop`にしましょう。


CC BY-SA 4.0
2022-08-13T10:32:11.237
90545
2022-08-13T10:32:11.237
39819
90544
answer


> name 'btn' is not defined

btn が存在していない、とおっしゃってますよ


CC BY-SA 4.0
2022-08-16T10:05:19.767
90583
2022-08-16T10:05:19.767
27481
90544
answer


対処としては @merino さんの方法が正しいのですが、原因とか理由は以下になります。

エラーが発生しているのはこの関数の以下の行ですが：

[code]

    def startandstop():
        global mode
        if mode==1:
            mode=2
            btn.configure(text="start")
        else:
            mode=1
            btn.configure(text="stop")  #### エラーメッセージが表示しているのはこの行
    
[/code]

その原因となっているのはこちらの行です。

[code]

    btn=tk.Button(text="start",font=("MSゴシック Classic","150","normal"),command=startandstop())
    
[/code]

パラメータの`command=startandstop()`の最後に`()`が付いているのが原因であり、@merino
さん回答のようにそれを取って`command=startandstop`にすれば「問題のエラーは」解決します。  
(ただし表示する部品のサイズとかストップウォッチ表示の設定等がおかしいので正常に動いているようには見えません)

[code]

    btn=tk.Button(text="start",font=("MSゴシック Classic","150","normal"),command=startandstop)
    
[/code]

使っているIDE等環境の関係なのか、素のPythonをコマンドプロンプトで実行すると以下のようにエラー発生時に呼び出しスタックも表示されるので、何処から何が起こっているのか分かりやすいでしょう。

[code]

    C:\Develop\Python>py soqa0813.py
    Traceback (most recent call last):
      File "C:\Develop\Python\soqa0813.py", line 44, in <module>
        btn=tk.Button(text="start",font=("MSゴシック Classic","150","normal"),command=startandstop())
      File "C:\Develop\Python\soqa0813.py", line 36, in startandstop
        btn.configure(text="stop")
    NameError: name 'btn' is not defined. Did you mean: 'bin'?
    
[/code]

* * *

理由は、正しい方法の`command=startandstop`の時は`command`パラメータに設定されるのは`def
startandstop():`で定義された関数オブジェクト(のエントリポイント)なのですが、間違って`command=startandstop()`と言う風に`()`を付けてパラメータを記述すると、`command`パラメータに設定されるのは`startandstop()`関数を実行して処理した結果の戻り値になるからです。

つまり、この行`btn=tk.Button(text="start",font=("MSゴシック
Classic","150","normal"),command=startandstop())`のパラメータ設定のために`def
startandstop():`を呼び出していて、その中で`btn.configure(text="stop")`と言う風に`btn`オブジェクトを参照していますが、その対象である`btn`オブジェクトはパラメータが全て設定されて`tk.Button(...)`が処理された結果の戻り値が格納されて出来るものなので、この時点では存在していません。

なので`btn`を定義・初期化するための`tk.Button(...)`の`command`パラメータに設定するために`def
startandstop():`が呼び出された時点では、まだ`btn`という名前を持つ何かは定義されていないので未定義だと言うエラーになる訳です。

* * *

ストップウォッチとしてのプログラム例だと、微妙に構造とか機能が違いますが、こんな記事が参考になるかもしれません。  
[Python 3 Tkinter Mini Stopwatch Timer Alarm Clock Script GUI Desktop
App](https://codingdeekshi.com/python-3-tkinter-mini-stopwatch-timer-alarm-
clock-script-gui-desktop-app/)


CC BY-SA 4.0
2022-08-16T11:29:32.820
90584
2022-08-16T11:29:32.820
26370
90544
answer