質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1131閲覧

tkinterでボタンにcommand=lambda:を使用してプログラムを終了させたときの動作が違う理由を教えてください

mikumikuDM

総合スコア82

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/08/20 15:34

編集2022/08/20 16:43

前提

以下ソースコードにてボタンを押してdef 終了()を実行したときとキーボードの2を押してdef 終了()を実行したときで
動作がことなります。
キーボードの2を押してdef 終了()を実行したときはソースコードの一番下にあるprint("終了")が実行される
ボタン2を押してdef 終了()を実行したときはソースコードの一番下にあるprint("終了")が実行されない
なぜ異なるかについての質問と
同じにするためにはどのようにdef 終了()を書けばいいかの質問です。
質問の目的はプログラミングのわからないところを知ることです。
新たにdefを作成してボタンとキー入力で実行されるdefを変える方法は質問の趣旨にそぐわないです。

実現したいこと

  • [ ]2を押したときにdef 終了()が実行され、ソースコードの一番下にあるprint("終了")が実行される
  • [ ]ボタン2を押したときにdef 終了()が実行され、ソースコードの一番下にあるprint("終了")が実行される

該当のソースコード

python

1import tkinter as tk 2from pynput.keyboard import Key, Listener 3 4class テスト(tk.Frame): 5 def __init__(self, master = None): 6 super().__init__(master) 7 self.master.title("質問用") 8 self.master.geometry("420x640") 9 self.key_listener = Listener(on_press=self.on_press) 10 11 button1 = tk.Button(self.master, 12 font=("", "10"), 13 text="ボタン1", # ボタンの表示名 14 command=lambda: self.on_press("1"), # クリックされたときに呼ばれるメソッド 15 width=10, 16 height=5 17 ) 18 button1.place(x=10, y=10) 19 20 button2 = tk.Button(self.master, 21 font=("", "10"), 22 text="ボタン2", # ボタンの表示名 23 command=lambda: self.on_press("2"), # クリックされたときに呼ばれるメソッド 24 width=10, 25 height=5 26 ) 27 button2.place(x=90, y=10) 28 29 def on_press(self,key): 30 if not type(key) is str: 31 key = key.char 32 if key == "1": 33 __class__.neko() 34 elif key == "2": 35 __class__.終了() 36 37 def 終了(): 38 root.destroy() 39 exit() 40 41 def neko(): 42 print("ねこ") 43 44if __name__ == "__main__": 45 root = tk.Tk() 46 app = テスト(master = root) 47 app.key_listener.start() 48 app.mainloop() 49 app.key_listener.stop() 50 print("終了")

動作時のターミナルのメッセージ

キー入力時

PS C:\Users\hatun\Desktop\pythontest> c:; cd 'c:\Users\hatun\Desktop\pythontest'; & 'C:\Users\hatun\AppData\Local\Programs\Python\Python39\python.exe' 'c:\Users\hatun\.vscode\extensions\ms-python.python-2022.12.1\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '63059' '--' 'c:\Users\hatun\Desktop\pythontest\test1.py' 終了 PS C:\Users\hatun\Desktop\pythontest>

ボタン入力時

PS C:\Users\hatun\Desktop\pythontest> c:; cd 'c:\Users\hatun\Desktop\pythontest'; & 'C:\Users\hatun\AppData\Local\Programs\Python\Python39\python.exe' 'c:\Users\hatun\.vscode\extensions\ms-python.python-2022.12.1\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '63234' '--' 'c:\Users\hatun\Desktop\pythontest\test1.py' PS C:\Users\hatun\Desktop\pythontest>

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2022/08/20 16:23

> 動作がことなります。 "どう"異なるのでしょうか?(質問者さんの環境で実際に起きていることを教えてください)
mikumikuDM

2022/08/20 16:38

失礼いたしました、追記いたします。
meg_

2022/08/20 16:40

def 終了():内のexit()を削除してはどうでしょうか?
mikumikuDM

2022/08/20 16:47

試した結果どちらの場合でもソースコードの一番下にあるprint("終了")が実行される状態になりましたありがとうございます!
guest

回答2

0

ベストアンサー

def 終了():内のexit()を削除するとボタンとキー押下で同じ動作(どちらも”終了"が出力される)となりました。

pynputを使用せずにtkninterのみでキーイベント処理を実装するとボタンとキー押下で同じ動作(どちらも”終了"は出力されない)でしたので、pynputモジュールがボタンとキー押下時の動作の差異に影響していると思われます。pynputモジュールに明るくないため理由についてまでは分かりません。

投稿2022/08/20 17:04

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

meg_様の質問の通りにdef 終了():内のexit()を削除して解決することができました、質問にベストアンサーがつけられないためこちらで解決方法を書かせていただきます。

投稿2022/08/20 16:56

mikumikuDM

総合スコア82

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問