2016-08-12 20 views
1

這裏是Zetcode.com一個簡單的代碼,是我學習:應用動態的解決方案,以Pyqt5連接

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 

""" 
ZetCode PyQt5 tutorial 

In this example, we create a skeleton 
of a calculator using a QGridLayout. 

author: Jan Bodnar 
website: zetcode.com 
last edited: January 2015 
""" 

import sys 
from PyQt5.QtWidgets import (QWidget, QGridLayout, 
    QPushButton, QApplication) 


class Example(QWidget): 

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

     self.initUI() 


    def initUI(self): 

     grid = QGridLayout() 
     self.setLayout(grid) 

     names = ['Cls', 'Bck', '', 'Close', 
       '7', '8', '9', '/', 
       '4', '5', '6', '*', 
       '1', '2', '3', '-', 
       '0', '.', '=', '+'] 

     positions = [(i,j) for i in range(5) for j in range(4)] 

     for position, name in zip(positions, names): 

      if name == '': 
       continue 
      button = QPushButton(name) 
      grid.addWidget(button, *position) 

     self.move(300, 150) 
     self.setWindowTitle('Calculator') 
     self.show() 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

現在,我想套用button.setDisable選項,每哪個按鈕被點擊。

一種方法是創建一個新列表並將每個按鈕追加到創建的列表中。從這個列表中,我們可以做到以下幾點:

button_list[0].clicked.connect(self.on_click): 
button_list[1].clicked.connect(self.on_click1): 

併爲每個新的方法,我們便需要定義:

def on.click(self): 
    button_list[0].setEnabled(False) 

這是一個可行的解決方案。但是有沒有更多的動態方法來解決這個問題?

希望有任何想法。

回答

0

隨着lambdafunctools.partial,你可以做到這一點:

def on.click(self, numb): 
    button_list[numb].setEnabled(False) 

調用與lambda

button_list[1].clicked.connect(lambda: self.on_click(1)) 

或者與partial

button_list[1].clicked.connect(partial(self.on_click, 1)) 
+0

謝謝Flippy。我發現部分功能對於進一步的發展也非常有用。 –

+0

不客氣,祝你的代碼順利:) – Flippym

相關問題