tkinterでGUIアプリを作っていて、Menubarがあるのでそこにメニューを追加、画面上にボタンも付けて、ボタンを押してもメニューから選んでも同じ処理をしたい、となったんだけれど、ボタンの方は動くのに、メニューの方からは「引数が足りません!」と怒られました。
怒られたコードはざっくりこんな感じ。
# メニューバー
menubar = tk.Menu(root, tearoff=False)
root["menu"] = menubar
filemenu = tk.Menu(menubar, tearoff=False)
menubar.add_cascade(label="File", menu=filemenu, accelerator="F")
filemenu.add_command(label="開く", command=self.open_pyfile)
# ボタン
self.btn1_text = tk.StringVar()
self.btn1_text.set(gui_text["button1"])
button1 = ttk.Button(frame1, textvariable=self.btn1_text, style="TButton")
button1.bind("<ButtonPress>", self.open_pyfile)
def open_pyfile(self, event):
"""ファイルを開く
Args:
event (_type_): _description_
Returns:
Path: 選択されたファイル
"""
ofile = filedialog.askopenfilename(
initialdir=Path.cwd(),
title="ファイルを開く",
filetypes=(
("Python files", "*.py;*.pyw"),
("JSON files", "*.json"),
("All files", "*.*"),
),
)
self.file1.set(ofile)
return Path(ofile)
ボタンの方はちゃんと動くけれど、メニューから「開く」を選んだ瞬間に引数が足りないと言われます。
ググってみても検索語の選び方がうまくないのか、lambda: するといいよ、とかいろいろ引っかかるんですが、こうすれば解決できました。
def open_pyfile(self, event=None):要は、eventが引き数にあればそれでいいし、ない場合にはNoneにしちゃえ、ということです。実際にevent変数を使用した処理をしているなら、event==Noneならメニューから呼ばれたものとして扱えばいいわけですし。
自分的には目からウロコでした。