get paid

Get paid for the tasks you do online

2019年1月29日 星期二

PyQT5 教學 --- 訊號與曹進階2

上一篇有提到訊號呼叫槽 函數時不能帶參數, 但以我們 9 9 乘法表的例子
我們一定要帶參數啊, 不然就要寫很多訊號跟槽了
之前不知不能帶參數 花了很多時間 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()

結果如下



沒有留言:

張貼留言

Bloomberg Markets Wrap 2025-08-15: 股市因美國數據下漲,川普與普丁會議獲關注

 Bloomberg Markets Wrap 2025-08-15: 股市因美國數據下滑,川普與普丁會談受關注 發佈日期:2025-08-15 本篇文章翻譯與整理自 Bloomberg Markets Wrap(經 SWI swissin fo.ch 彙整),該報111導回顧了...