96511


## 前提条件

**OS**  
Windows 11 ProのWSL2上のUbuntu 22.04 LTS

**その他**  
venv  
VS Code上のJupyter

## 期待値

判定ボタンを押したときに、関数q_switch()を動作させる。

## 再現手順

下のPythonのコードを実行する。

[code]

    from tkinter import *
    import random
    
    # お題のリスト
    QUESTION = ["バナナ",
                "いちご",
                "パイナップル",
                "りんご",
                "イチジク",
                "きゅうり",
                "トマト",
                "なす"]     
    
    root = Tk()
    root.title("Typing Game")
    root.geometry("500x500")
    
    q_ran = random.choice(QUESTION)
    
    def q_switch():
        var.set(q_ran)
    
    # StringVarの設定
    var = StringVar(root)
    var.set(q_ran)
    
    # Frameの設定
    frame = Frame(root)
    
    # Frameをpackで配置
    frame.pack(expand=True, fill=BOTH)
    
    # Widgetの設定
    topic = Label(frame, text="お題: "+var) # お題をランダムに表示
    button = Button(frame, text="判定！", command=q_switch()) # 押すと判定&お題が変更
    
    # Widgetをpackで配置
    topic.pack()
    button.pack()
    
    root.mainloop()
    
[/code]

## その他

エラーメッセージ

[code]

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    /home/kamome_run/practice-python/practice-venv/typing-game/typing-game.ipynb セル 2 line 2
         26 frame.pack(expand=True, fill=BOTH)
         28 # Widgetの設定
    ---> 29 topic = Label(frame, text="お題: "+var) # お題をランダムに表示
         30 button = Button(frame, text="判定！", command=q_switch()) # 押すと判定&お題が変更
         32 # Widgetをpackで配置
    
    TypeError: can only concatenate str (not "StringVar") to str
    
[/code]

データ型がstrじゃないとvarと連結できないと出ていますが、変数varの中身はstr型のはずです。


CC BY-SA 4.0
2023-10-17T12:31:05.740
96510
2023-10-17T16:21:19.743
2023-10-17T16:21:19.743
3060
56107
question
python python3 tkinter
tkinterのButton()に設定した関数を、ボタンを押したときに動作するようにしたい


> # お題をランダムに表示  
>  # 押すと判定&お題が変更
[code]

    from tkinter import *
    import random
    
    # お題のリスト
    QUESTION = ["バナナ",
                "いちご",
                "パイナップル",
                "りんご",
                "イチジク",
                "きゅうり",
                "トマト",
                "なす"]     
    
    root = Tk()
    root.title("Typing Game")
    root.geometry("500x500")
    
    # q_ran = random.choice(QUESTION)
    
    def q_switch():
        global var
        var.set("お題: " + random.choice(QUESTION))
    
    # StringVarの設定
    var = StringVar(root)
    var.set("お題: " + random.choice(QUESTION))
    
    # Frameの設定
    frame = Frame(root)
    
    # Frameをpackで配置
    frame.pack(expand=True, fill=BOTH)
    
    # Widgetの設定
    topic = Label(frame, textvariable=var) # お題をランダムに表示
    button = Button(frame, text="判定！", command=q_switch) # 押すと判定&お題が変更
    
    # Widgetをpackで配置
    topic.pack()
    button.pack()
    
    root.mainloop()
    
[/code]


CC BY-SA 4.0
2023-10-17T13:06:39.430
96511
2023-10-17T14:32:52.250
2023-10-17T14:32:52.250
47127
47127
96510
answer


エラーの出ている

[code]

    topic = Label(frame, text = "お題: " + var) # お題をランダムに表示
    
[/code]

の部分は、

[code]

    topic = Label(frame, text = "お題: " + var.get()) # お題をランダムに表示
    
[/code]

とする必要があります。`StringVar` と `str` は型が違うというエラーが出ているわけです。`StringVar` そのものが `str`
なのではなくて、`StringVar` から `get()` で値の `str` を取り出さなければなりません。


CC BY-SA 4.0
2023-10-17T14:48:04.803
96512
2023-10-17T14:48:04.803
7290
96510
answer