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

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

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

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Q&A

1回答

796閲覧

ウィンドウフォーカスをプログラムで操作して、GUIへのフォーカスを、それを自動で操作するプログラムの起動時に自動で戻したい。

kasanegi

総合スコア20

Python 3.x

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

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

0グッド

0クリップ

投稿2019/01/13 02:42

編集2019/01/13 02:45

使用ツール・環境

・python3.6.5
・ライブラリ: PyQt5, keyboard
・windows10

やりたいこと

以下の二つのプログラムの連携。
①ゲームプログラム: キー入力に応じて図形を表示するgomiゲーム。
②操作プログラム: キーを自動で入力するプログラム。

わざわざ二つのプログラムに分けているのは、今後操作プログラムの方を改良することを考えると、できるだけ疎結合な状態が望ましいと思ったからです。

現状と問題点

まず、現在までに←, ↑, →, のキー入力に応じて図形を表示するgomiゲーム(ですらない)をPyQt5を用いて書きました。コードはこちらになります。

python

1import sys 2from PyQt5.QtCore import Qt, QPointF 3from PyQt5.QtWidgets import QWidget, QApplication 4from PyQt5.QtGui import QPainter, QColor, QBrush, QPolygonF 5 6class Example(QWidget): 7 def __init__(self): 8 super().__init__() 9 10 self.func = (None, None) 11 self.initUI() 12 13 def initUI(self): 14 self.width = 250 15 self.height = 150 16 self.setGeometry(300, 300, self.width, self.height) 17 self.setWindowTitle("Event handler") 18 self.show() 19 20 def keyPressEvent(self, e): 21 if e.key() == Qt.Key_Up: # 長方形を表示 22 self.func = (self.drawRectangles, {}) 23 self.update() 24 25 elif e.key() == Qt.Key_Right: # 円を表示 26 self.func = (self.drawCircle, {}) 27 self.update() 28 29 elif e.key() == Qt.Key_Left: # 三角形を表示 30 self.func = (self.drawTriangle, {}) 31 self.update() 32 33 else: 34 self.func = (self.cleanWindow, {}) 35 self.update() 36 37 def paintEvent(self, e): 38 qp = QPainter() 39 qp.begin(self) 40 self.drawFigure(qp) 41 qp.end() 42 43 def drawFigure(self, qp): 44 func, kwargs = self.func 45 if func is not None: 46 kwargs["qp"] = qp 47 func(**kwargs) 48 49 def drawRectangles(self, qp): 50 col = QColor(0, 0, 0) 51 col.setNamedColor('#d4d4d4') 52 qp.setPen(col) 53 qp.setBrush(QColor(200, 0, 0)) 54 55 qp.drawRect(10, 15, 90, 60) 56 57 def drawCircle(self, qp): 58 col = QColor(0, 0, 0) 59 col.setNamedColor('#d4d4d4') 60 qp.setPen(col) 61 qp.setBrush(QColor(200, 0, 0)) 62 63 qp.drawEllipse(0, 0, 90, 90) 64 65 def drawTriangle(self, qp): 66 col = QColor(0, 0, 0) 67 col.setNamedColor('#d4d4d4') 68 qp.setPen(col) 69 qp.setBrush(QColor(200, 0, 0)) 70 71 polygon = QPolygonF() 72 polygon.append(QPointF(50, 50)) 73 polygon.append(QPointF(100, 100)) 74 polygon.append(QPointF(0, 100)) 75 76 qp.drawPolygon(polygon) 77 78 def cleanWindow(self, qp): 79 qp.eraseRect(0, 0, self.width, self.height) 80

そこで次に、今手動でやっているゲームへのキー入力をライブラリkeyboardを用いて自動にしたかったのですが -- そしてキー入力自体は以下のプログラムで可能だったのですが --

python

1import keyboard 2 3recorded = keyboard.record(until='esc') 4keyboard.play(recorded)

ゲーム起動後、キー入力のプログラムを実行する=別ウィンドウから実行する別プログラムだからゲームウィンドウからフォーカスが外れる → キー入力が始まっても、ゲームウィンドウにフォーカスしてないからキー入力がゲームに反映されない。
というように、二つのプログラムの連携が取れません。

### 試したこと
-- 操作プログラムを変更し、実行から実際のキー入力が始まるまでの間にスリープ時間を設けた。そして、その間に手動でゲームウィンドウにフォーカスを戻した。

質問

--試したこと--に書いたような手動操作は望ましくなく、最終的には
「ゲーム、操作プログラムを起動しゲームウィンドウにフォーカスを置き、操作プログラムに操作信号(キー入力など)を受け入れるように知らせる」プログラムを作りたいと思っています。
そのために、ウィンドウフォーカスを操作するコードの書き方をご教授いただけないでしょうか?

どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

別プログラムにしないで、別のクラス/ユニットにして、疎結合で同一プログラムにするのではダメなんでしょうか。

投稿2019/01/13 02:58

y_waiwai

総合スコア87747

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

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

kasanegi

2019/01/13 03:47

回答ありがとうございます! PyQt5でループに入っているうちはそのスレッドは別用途には使えないので、自分で複数スレッドを用意するようにすればいけますかね? あまりスレッドに詳しくないので、今の段階でできるかはわかりませんが、調べてみます。
y_waiwai

2019/01/13 04:05

ムリに別プロセスにしてそのつじつま合わせに奔走するよりはそのほうが建設的だとは思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問