2017-03-11 5 views
0

私はこの機能を追加した場合:このコードにQKeyPressイベントがウィンドウなしで動作しないのはなぜですか?

def keyPressEvent(self, event): 
     if type(event) == QKeyEvent: 
      if event.key() == Qt.Key_0 or Qt.Key_1: 
       print('Key was pressed') 

を:

def distance(x1, y1, x2, y2): 
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2) 

class Frame: 
    def __init__(self, position, time): 
     self.position = position 
     self.time = time 

    def speed(self, frame): 
     d = distance(*self.position, *frame.position) 
     time_delta = abs(frame.time - self.time) 
     return d/time_delta 

class MainWindow(QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 

     self.last_frame = None 
     self.setMouseTracking(True) 

    def mouseMoveEvent(self, event): 

     nowTime = datetime.now() 
     mouseWasMoveAt = nowTime.strftime('%H:%M:%S') 

     new_frame = Frame((event.x(), event.y()), time.time()) 

     if self.last_frame: 
      print(new_frame.speed(self.last_frame), mouseWasMoveAt) #print speed and time 

     self.last_frame = new_frame 

    def keyPressEvent(self, event): 
     if type(event) == QKeyEvent: 
      if event.key() == Qt.Key_0 or Qt.Key_1: 
       print('Key was pressed')  

if __name__ == '__main__': 
    app = QApplication(sys.argv) 

    w = MainWindow() 
    w.resize(900,600) 
    w.show() 

    app.exec_() 

すべてが正常に動作しますが、これKeyPresseventは私が窓を持っている場合にのみ機能していないが、私は何のウィンドウを必要とする、私が欲しいですそのキーボードイベントはそれなしで処理されます。私はこのようにやろう:

class Frame: 
    def __init__(self, position, time): 
     self.position = position 
     self.time = time 


    def speed(self, frame): 
     d = distance(*self.position, *frame.position) 
     time_delta = abs(frame.time - self.time) 
     return d/time_delta 

    def keyPressEvent(self, event): 
     if type(event) == QKeyEvent: 
      if event.key() == Qt.Key_0 or Qt.Key_1: 
       print('Key was pressed') 

def distance(x1, y1, x2, y2): 
    return math.sqrt((x2 - x1)**2 + (y2-y1)**2) 

def get_current_cursor_position(): 
    pos = QCursor.pos() 
    return pos.x(), pos.y() 

def get_current_frame(): 
    return Frame(get_current_cursor_position(), time.time()) 



if __name__ == '__main__': 

    app = QApplication(sys.argv) 

    last_frame = get_current_frame() 


    while True: 
     nowTime = datetime.now() 
     mouseWasMoveAt = nowTime.strftime('%Y-%m-%d %H:%M:%S') 

     new_frame = get_current_frame() 

     if new_frame.speed(last_frame) != 0: 

      print(mouseWasMoveAt) 
      last_frame = new_frame 
      time.sleep(0.07) 

このコードは動作しません、私はどうあるべきかを行うには? そしてもう一つ質問です:私はif文に変更した場合、私が書く場合 はこの

def keyPressEvent(self, event): 
     if type(event) == QKeyEvent: 
      if event.key() == Qt.Key_0 or Qt.Key_1: 
       print('Key was pressed') 

プリント(のような私のKeyEventのfuncが)私が押して任意のキーを印刷しますが、event.key()== Qtの場合.Key_0 print()はKey_0ボタンだけを表示します。 なぜこれが起こっていますか?

答えて

0

作業コードkeyPressEventは、MainWindowのメンバーで、QMainWindowから継承しています。継承のために、Qtフレームワークは、イベントをMainWindowのインスタンスにディスパッチする方法を知っているので、keyPressEventが期待通りに呼び出されます。

Frameに失敗したコードでは、QWidget(またはそれに関係するもの)から何らかの形で継承されません。このように、Frameのインスタンスは基本的にQtから独立しており、したがってイベントはそれにポストされません。あなたの2番目の質問については

...

私が変更した場合場合にif文event.key()== Qt.Key_0印刷() 印刷のみKey_0ボタンがします。なぜこうなった?あなたはおそらくしたい

よりもむしろ...

if event.key() == Qt.Key_0 or Qt.Key_1: 

...

if event.key() == Qt.Key_0 or event.key() == Qt.Key_1: 

何が欲しいのは、キーボード入力を使用して、コンソールアプリケーションではなく、本格的なGUI、あなたの場合python cursesを見たいかもしれません。

+1

ありがとうございました!すでにこのlib https://github.com/boppreh/keyboardを使ってキーボードイベントを処理しています。 –

関連する問題