[Python / Error] tkinterで作成したbuttonのcommand処理の不具合

[Python / Error] tkinterで作成したbuttonのcommand処理の不具合

概要

  • pythonでwindowsプログラムをtkinterモジュールを利用して作成しています。
  • そこでbuttonを追加してクリック時の処理を作成していますが、
    起動時に勝手に実行されその後はボタンをクリックしても実行されない不具合がありました。
  • その不具合を対応するまでの手順を作成しました。

不具合内容

  • 起動時にボタンクリック時の処理 test_message()が勝手に実行される
  • test_message()のメッセージが表示されているときにボタンは表示されていない
  • 『OK』をクリックするとボタンは表示されるようになるが、
    その後ボタンをクリックしてもtest_message()のメッセージは表示されない
tkinter_button.py
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

# メッセージ表示処理
def test_message():
  messagebox.showinfo("Test", "Message")
  
# 起動処理
if __name__ == '__main__':
  window = Tk()
  
  # windows
  window.title("ButtonTest")
  window.geometry("300x100")

  # frame
  frame = ttk.Frame(window)
  frame.grid(row=0,column=0,padx=5,pady=5)
  
  # messageボタン
  button_message = ttk.Button(
      frame,
      text='button',
      command=test_message())
  button_message.grid(row=0,column=0,padx=20,pady=20)

  # mainloop開始
  window.mainloop()

開発環境

  • Python 3.12.5

参考

対応

buttonのcommandにlambdaを追記する

  • button定義のcommandの最初に『lambda:』を追加します。
  • command に lambdaで無名関数の宣言後に実行する処理を作成しました。
  • それで起動時に test_message()は実行されず、ボタンをクリックすると実行されます。
tkinter_button.py
from tkinter import *
from tkinter import ttk
from tkinter import messagebox

# ---------------------------- 中略 ---------------------------- 
  
  # messageボタン
  button_message = ttk.Button(
      frame,
      text='button',
      # commandの最初に『lambda:』を追加する
      command=lambda:test_message())
  button_message.grid(row=0,column=0,padx=20,pady=20)

# ---------------------------- 中略 ----------------------------