…しかも4時間で出来た…なんか降りてくる時ってありますね。
昨年2月2つ前の会社を辞めた際、作ると言っていたソフトがありました。タッチパネルでカーソルキー入力をするツールです。
なんでこんなものが必要かというと、Linux の画像ビューアは大抵タッチパネルに対応しておらず、画面をタッチしてページ送りといった事が出来なかったからです。
同様に、動画や音声の早送り等もキーボードを前提としたタッチでは使いづらいソフトばかりとなっています。
一応、標準で搭載されている Onboard を使えばできるのですが、フルキーではなくカーソルキーだけのアプリが欲しかったのです。
私は Arrows Tab に Linux を入れて使っているのでこれはかなり優先度が高かったのですが…
で、なぜ今更そんなものを作っているのかというと、初手でテンキー繋げばよいじゃんとなったからですね。
ジャンク屋で100円くらいで売っています。風呂で使うならビニール袋をかぶせて輪ゴムで留めておけば良い。が…流石に面倒になりまして。
開発は割と大変
ガワは kivy で作る事がほぼ確定していましたが、じゃあキー入力部分は?と言えば、pyautogui を使う事は決めていました。
Python の教書の中でベストセラーになった「退屈なことはPythonにやらせよう」という本がありまして、一応少し読んではいたのですよ。
が、実際作ってみるとめちゃくちゃ難航…
なぜか print デバッグできない
私は開発に初期状態の Geany を使っています。初期状態ではラインデバッグが出来ない為 print デバッグするしかないのですが…どういうわけか kivy 系の表示をコンソールに吐いた後は print 処理の表示を吐かなかったのですよね…おかげでかなり難航しました。
非アクティブなアプリにキー入力を送るには?
本アプリを最前列設定で表示するとして、疑似キーボードである以上、他のアプリにキー入力情報を渡す必要がありますがいくらやっても自分自身にキー入力情報が渡ってしまいます。
AIですらこんな回答をしています。
調べたら起動しているアプリ一覧をOSから引き出して、特定アプリにアクセスする…等と出てきまして、難航するしOS毎に挙動が違うしで詰んだかな…と、思いましたが…
ソースここから
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
import pyautogui
class LaySub(BoxLayout):
def __init__(self,**kwargs):
super(LaySub,self).__init__(**kwargs)
self.orientation='vertical'
self.b3 = Button(text='^',size_hint_y=1)
self.b3.bind(on_release=self.release_up)
self.b4 = Button(text='v',size_hint_y=1)
self.b4.bind(on_release=self.release_down)
self.add_widget(self.b3)
self.add_widget(self.b4)
def release_up(self, instance):
pyautogui.hotkey('alt', 'tab')
pyautogui.press('up')
pyautogui.hotkey('alt', 'tab')
def release_down(self, instance):
pyautogui.hotkey('alt', 'tab')
pyautogui.press('down')
pyautogui.hotkey('alt', 'tab')
class LayMain(BoxLayout):
def __init__(self,**kwargs):
super(LayMain,self).__init__(**kwargs)
self.clear_widgets()
self.orientation='horizontal'
self.b1 = Button(text='<',size_hint_x=1)
self.b1.bind(on_release=self.release_left)
self.b2 = Button(text='>',size_hint_x=1)
self.b2.bind(on_release=self.release_right)
self.l1 = LaySub(size_hint_x=1)
self.add_widget(self.b1)
self.add_widget(self.l1)
self.add_widget(self.b2)
def release_left(self, instance):
pyautogui.hotkey('alt', 'tab')
pyautogui.press('left')
pyautogui.hotkey('alt', 'tab')
def release_right(self, instance):
pyautogui.hotkey('alt', 'tab')
pyautogui.press('right')
pyautogui.hotkey('alt', 'tab')
class MainApp(App):
def build(self):
self.title = "mini key"
Window.size = (300,100)
Window.always_on_top = True
layout = LayMain()
return layout
if __name__=='__main__':
MainApp().run()
ソースここまで
はい。
ボタンから手を離した状態を検知した所で
Alt+Tab(一つ前にアクティブだったアプリに切り替えるショートカット)
↓
カーソルキー入力
↓
Alt+Tab(本アプリに戻る)
…あまりにもバカバカしい方法ですが、そらそうよという内容。ちなみに挙動は Linux Windows で共通… Mac でどう動くは解りません、持ってないので。
ひょっとして、投稿日現在のAIを出し抜いたのでは…
さておき、挙動は良好で画像ビューアではページ送りができますし、動画再生では巻き戻しも出来ます。ボタンを放した瞬間をとらえている都合上「押しっぱなし」操作はできませんがかなりQOLが上がります。久々に良い物が作れて満足です。



0 件のコメント:
コメントを投稿