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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

1回答

963閲覧

Macにて、キーボードのどのキーが押されたか検知し、特定の処理をする方法

Cocode

総合スコア2314

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2022/09/27 16:03

編集2022/09/27 17:57

知りたいこと

  • 矢印キーを押したら特定の処理をする方法
  • WindowとMacではキーボードのキーコードが違う?

作業環境

  • MacOS 12.3.1
  • conda 4.14.0
    • Python 3.10.4(仮想環境にインストールされているバージョン)
    • PySimpleGUI 4.60.3 (仮想環境にインストールされているバージョン)
  • VSCode

困っていること

動画教材の模写(ときには提供されているコードをコピペ)をしながらPythonの学習をしています。
矢印キー上下左右どれが押されたのか検知し、それぞれ別の処理を行うのですが、検知してくれていないのかif文が全く機能してくれません。
(今回の場合、左キーを押したらLeftとプリントされる処理です)

コードは以下の通りです。

python

1import PySimpleGUI as sg 2 3# game constants 4FIELD_SIZE = 400 5sg.theme('Green') 6field = sg.Graph( 7 canvas_size = (FIELD_SIZE, FIELD_SIZE), 8 graph_bottom_left = (0, 0), 9 graph_top_right = (FIELD_SIZE, FIELD_SIZE), 10 background_color = 'black') 11layout = [[field]] 12 13window = sg.Window('Snake', layout, return_keyboard_events = True) 14 15while True: 16 event, values = window.read() 17 # print(f"event='{event}', code={ord(event[0])}, values={values}\n") 18 if event == sg.WIN_CLOSED: break 19 if event == 'Left:37': print('left') 20 if event == 'Up:38': print('Up') 21 if event == 'Right:39': print('Right') 22 if event == 'Down:40': print('Down') 23 24window.close()

(出典:YouTube https://github.com/clear-code-projects/PySimpleGuiUltimate / GitHub https://github.com/clear-code-projects/PySimpleGuiUltimate/blob/main/snake.py)

調べたこと・試したこと

MacOSのキーコードっぽいものに書き換える

調べると、MacOSとWindowsはキーコードが違う?ようなことを目にしたので、上記のコードでコメントアウトしている記述のコメントを解除し、実行して番号を調べました。
(教材の講師のOSは不明です)

キーコードの調べ方の参考:https://qiita.com/GOU_KUN/questions/cf940c9a85eba56cb29d

python

1# これを実行して 2print(f"event='{event}', code={ord(event[0])}, values={values}\n") 3 4# 出力されたもの 5event='Left:2063660802', code=76, values={0: (None, None)} 6 7event='Up:2113992448', code=85, values={0: (None, None)} 8 9event='Right:2080438019', code=82, values={0: (None, None)} 10 11event='Down:2097215233', code=68, values={0: (None, None)}

教材のコードから'Left:37''Left:76''76'76というように4つとも3種類変更しましたが、何も起こりませんでした。

sudoでPython3を実行する

Macはセキュリティ上、Pythonがキー入力を追跡できないようにしているという記事を見かけたので、ターミナルから$ sudo python3 filename.pyで実行してみましたが、if文のところは何も起こりませんでした。
そもそも先に試したコードでキーコードっぽいものを出力できているので、セキュリティの問題ではなさそうだと感じました。

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

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

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

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

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

shamsham

2022/09/27 17:21

キーコードが文字列ではなく数値ということはないのでしょうか。 つまり、条件文に '76' などではなく 76 と数字で入力してもうまくいきませんか?
Cocode

2022/09/27 17:59 編集

ご協力ありがとうございます!やってみましたがダメでした。 print(type(ord(event[0]))) で型を確認してみたところ <class 'int'> が出力されたので、数値であるということは当たっているようです! (後からみてくださる他の回答者様のために、「調べたこと、試したこと」に数値としての76を追記しました)
shamsham

2022/09/27 18:02

問題のコードを見てみると、if分の条件で、event と比べているようですが、 実際に比べるのはキーコードなので、ord(event[0]) などではないでしょうか。
Cocode

2022/09/27 18:12

ord(event[0]) == 76 でいけましたありがとうございますー!!!!!!!どうして教材通りの記述方法だとうまくいかないのかという問題は残っていますが、とりあえず動くものができて嬉しいです。ありがとうございます。
Cocode

2022/09/27 18:14

よければこのコメント欄ではなく、回答として投稿してもらえませんでしょうか?ベストアンサーに選ばせていただいて、この質問を完了させたいです!
shamsham

2022/09/27 18:15

わかりました! そうさせていただきます。
guest

回答1

0

ベストアンサー

コードでは、問題の if 文のところで event とキーコードなどと比べようとしているので、
ord(event[0]) と比べるとうまくいくと思います。

投稿2022/09/27 18:17

shamsham

総合スコア38

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

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

Cocode

2022/09/27 18:30

ord(event[0]) == 76 で無事できました!教材通りではないのですが、とりあえず動作するものができて嬉しいです!!教材通りにこだわらず、ちゃんとプログラムの観点から解決に導いてくださったのがプロだなぁと感じました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問