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

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

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

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

Q&A

解決済

1回答

756閲覧

keyboardを長押ししたとき最初に押されたときと最後に離されたときだけを検知したい

ririkaru

総合スコア3

Python 3.x

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

0グッド

0クリップ

投稿2023/05/04 08:39

実現したいこと

無知な初心者です
pythonでキーイベントを検知するとき keyboard長押しすると連打されるため
PressイベントとReleaseイベントを繰り返し検知してしまいますが

長押しでキーが連打されている間
shellでは
最初にPressイベントを検知したときprint('キーが押されました')
最後にReleaseイベントが検知したときprint('キーが離されました')
とだけ表示されるようにしたいです

前提

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11216523206
より
Pressイベントが検知されたときの処理の仕方はわかりました
ただReleaseの時どうすればいいかわかりません
以下がそのコードになります

該当のソースコード

python

1from tkinter import* 2import datetime 3 4tk=Tk() 5canvas=Canvas(tk,width=100,height=100,bd=0) 6canvas.pack() 7 8dt = datetime.timedelta(seconds=0.1) 9t = datetime.datetime.now() 10 11#キーPressイベント 12def key_a(event): 13 #なぜここの変数dtをグローバルにする必要があるのかも教えていただけると嬉しいです 14 global t,dt 15 if datetime.datetime.now()-t > dt: 16 print('キーが押されました') 17 18#キーReleaseイベント 19def key_b(event): 20 global t 21 t=datetime.datetime.now() 22 #if datetime.datetime.now()-t > dt or 最後に検知されてから0.1秒たってもtの値が変更されていない: 23 # print('キーが離されました') 24 #って書けばいけるのかなーって思ってますが、書き方わかりません涙 25 26 27canvas.bind_all('<KeyPress>',key_a) 28canvas.bind_all('<KeyRelease>',key_b) 29 30tk.mainloop()

試したこと

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

環境 raspberrypi4からThonny Python IDEで実行

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

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

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

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

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

guest

回答1

0

ベストアンサー

別解ですが、

環境 Raspberry Pi4

とのことですので、OS は Debian 系の Linux distribution という前提で回答します。
※ Windows や OSX などでは想定する動作にはなりませんので、ご注意ください

最初にキー・リピートをオフにしておきます。(xset r off) そして、キー入力の状態を canvas ウィジェットの属性(canvas.keypressed)で保持します。

python

1from tkinter import * 2import os 3 4os.system('xset r off') 5 6tk=Tk() 7canvas=Canvas(tk,width=100,height=100,bd=0) 8canvas.pack() 9 10#キーPressイベント 11def key_a(event): 12 if not canvas.keypressed: 13 print('キーが押されました') 14 canvas.keypressed = True 15 16#キーReleaseイベント 17def key_b(event): 18 print('キーが離されました') 19 canvas.keypressed = False 20 21canvas.bind_all('<KeyPress>',key_a) 22canvas.bind_all('<KeyRelease>',key_b) 23canvas.keypressed = False 24 25tk.mainloop() 26 27os.system('xset r on')

投稿2023/05/04 10:27

melian

総合スコア19805

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

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

ririkaru

2023/05/05 08:49

ありがとうございます(^▽^) 頂いたコードで やりたいことを実現することができました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問