使用ツール・環境
・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)
ゲーム起動後、キー入力のプログラムを実行する=別ウィンドウから実行する別プログラムだからゲームウィンドウからフォーカスが外れる → キー入力が始まっても、ゲームウィンドウにフォーカスしてないからキー入力がゲームに反映されない。
というように、二つのプログラムの連携が取れません。
### 試したこと
-- 操作プログラムを変更し、実行から実際のキー入力が始まるまでの間にスリープ時間を設けた。そして、その間に手動でゲームウィンドウにフォーカスを戻した。
質問
--試したこと--に書いたような手動操作は望ましくなく、最終的には
「ゲーム、操作プログラムを起動しゲームウィンドウにフォーカスを置き、操作プログラムに操作信号(キー入力など)を受け入れるように知らせる」プログラムを作りたいと思っています。
そのために、ウィンドウフォーカスを操作するコードの書き方をご教授いただけないでしょうか?
どうぞよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/13 03:47
2019/01/13 04:05