2017-03-07 79 views
0

我試圖寫一個虛擬鍵盤PyQt5代碼。這是我的代碼。PyQt5虛擬鍵盤(類型錯誤:失蹤1人需要的位置參數)

from PyQt5.QtCore import * 
from PyQt5.QtWidgets import * 


class InputState: 
    LOWER = 0 
    CAPITAL = 1 


class KeyButton(QPushButton): 
    sigKeyButtonClicked = pyqtSignal() 

    def __init__(self, key): 
     super(KeyButton, self).__init__() 

     self._key = key 
     self._activeSize = QSize(50,50) 
     self.clicked.connect(self.emitKey) 
     self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) 


    def emitKey(self): 
     self.sigKeyButtonClicked.emit() 

    def enterEvent(self, event): 
     self.setFixedSize(self._activeSize) 

    def leaveEvent(self, event): 
     self.setFixedSize(self.sizeHint()) 

    def sizeHint(self): 
     return QSize(40, 40) 

class VirtualKeyboard(QWidget): 
    sigInputString = pyqtSignal() 
    sigKeyButtonClicked = pyqtSignal() 

    def __init__(self): 
     super(VirtualKeyboard, self).__init__() 

     self.globalLayout = QVBoxLayout(self) 
     self.keysLayout = QGridLayout() 
     self.buttonLayout = QHBoxLayout() 

     self.keyListByLines = [ 
        ['a', 'z', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'], 
        ['q', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm'], 
        ['w', 'x', 'c', 'v', 'b', 'n', '_', '.', '/', ' '], 
       ] 
     self.inputString = "" 
     self.state = InputState.LOWER 

     self.stateButton = QPushButton() 
     self.stateButton.setText('Maj.') 
     self.backButton = QPushButton() 
     self.backButton.setText('<-') 
     self.okButton = QPushButton() 
     self.okButton.setText('OK') 
     self.cancelButton = QPushButton() 
     self.cancelButton.setText("Cancel") 

     self.inputLine = QLineEdit() 


     for lineIndex, line in enumerate(self.keyListByLines): 
      for keyIndex, key in enumerate(line): 
       buttonName = "keyButton" + key.capitalize() 
       self.__setattr__(buttonName, KeyButton(key)) 
       self.keysLayout.addWidget(self.getButtonByKey(key), self.keyListByLines.index(line), line.index(key)) 
       self.getButtonByKey(key).setText(key) 
       self.getButtonByKey(key).sigKeyButtonClicked.connect(self.addInputByKey) 
       self.keysLayout.setColumnMinimumWidth(keyIndex, 50) 
      self.keysLayout.setRowMinimumHeight(lineIndex, 50) 

     self.stateButton.clicked.connect(self.switchState) 
     self.backButton.clicked.connect(self.backspace) 
     self.okButton.clicked.connect(self.emitInputString) 
     self.cancelButton.clicked.connect(self.emitCancel) 


     self.buttonLayout.addWidget(self.cancelButton) 
     self.buttonLayout.addWidget(self.backButton) 
     self.buttonLayout.addWidget(self.stateButton) 
     self.buttonLayout.addWidget(self.okButton) 

     self.globalLayout.addWidget(self.inputLine) 
     self.globalLayout.addLayout(self.keysLayout) 

     self.globalLayout.addLayout(self.buttonLayout) 
     self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) 


    def getButtonByKey(self, key): 
     return getattr(self, "keyButton" + key.capitalize()) 

    def getLineForButtonByKey(self, key): 
     return [key in keyList for keyList in self.keyListByLines].index(True) 

    def switchState(self): 
     self.state = not self.state 

    def addInputByKey(self, key): 
     self.inputString += (key.lower(), key.capitalize())[self.state] 
     self.inputLine.setText(self.inputString) 

    def backspace(self): 
     self.inputLine.backspace() 
     self.inputString = self.inputString[:-1] 

    def emitInputString(self): 
     self.sigInputString.emit(self.inputString) 

    def emitCancel(self): 
     self.sigInputString.emit() 

    def sizeHint(self): 
     return QSize(480,272) 


class Test(QWidget): 
    def __init__(self): 
     super(Test, self).__init__() 

     self.b1 = KeyButton("1") 
     self.b2 = KeyButton("2") 
     self.b3 = KeyButton("3") 
     self.b4 = KeyButton("4") 

     self.layout = QGridLayout(self) 
     self.layout.addWidget(self.b1,0,0) 
     self.layout.addWidget(self.b2,0,1) 
     self.layout.addWidget(self.b3,1,0) 
     self.layout.addWidget(self.b4,1,1) 

if __name__ == '__main__': 

    import sys 
    app = QApplication(sys.argv) 
    win = VirtualKeyboard() 
    win.show() 
    app.exec_() 

我得到錯誤:類型錯誤:addInputByKey()失蹤1個人需要的位置參數: '鍵'

任何幫助嗎?

+0

請告訴我們堆棧跟蹤,不只是例外。 – Alfe

+1

@Alfe我只有這得到儘可能的錯誤,但是當我運行的代碼,我得到了鍵盤,但點擊一些關鍵之後,程序崩潰和錯誤顯示 – alekssandrap

回答

0

你是不是傳遞價值?

from functools import partial 
... 

self.getButtonByKey(key).sigKeyButtonClicked.connect(partial(self.addInputByKey, key)) 
0

的解決方案是可以改變:

self.getButtonByKey(key).sigKeyButtonClicked.connect(self.addInputByKey) 

要這樣:

self.getButtonByKey(key).sigKeyButtonClicked.connect(lambda v=key: self.addInputByKey(v)) 
相關問題