我們一定要帶參數啊, 不然就要寫很多訊號跟槽了
之前不知不能帶參數 花了很多時間 try and error.
這也是為何我要寫這個 Blog 的原因之一
解法其實很簡單, 網路上有人提到用lambda , 但我比較喜歡用partial.
partial 是 functools 下的一個函數
只要將要呼叫的function ,與 參數 改用 partical 包起來就可以了
k.clicked.connect(partial(showMessage,i,j))
完整程式如下
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QPushButton,QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
from functools import partial #import partial
def window():
app = QApplication(sys.argv)
win = QWidget()
grid = QGridLayout()
dict =[]
for i in range(0,9):
for j in range(0,9):
k = QPushButton(str(i+1)+"*"+str(j+1))
grid.addWidget(k,i,j)
print(k)
k.clicked.connect(partial(showMessage,i,j)) #呼叫showMessage 並帶入i, j
win.setLayout(grid)
win.setWindowTitle("PyQt Grid Example")
win.setGeometry(50,50,200,200)
win.show()
sys.exit(app.exec_())
def showMessage(i,j):
x=(i+1)*(j+1)
msgBox = QMessageBox()
msgBox.setText("{} * {}= {}".format(str(i+1),str(j+1),str(x)))
msgBox.setWindowTitle("Signal & Slot ")
msgBox.setStandardButtons(QMessageBox.Ok)
# msgBox.buttonClicked.connect(msgButtonClick)
msgBox.exec()
msgBox.show()
if __name__ == '__main__':
window()
結果如下
沒有留言:
張貼留言