2009-04-10 16 views
1

からウィジェットを作成するためのループ内で使用されたとき、私はGUIプログラムを持って、PyQtはconnectメソッドのバグリスト

これは、自動名前リストからボタン、 を作成し、機能に接続するには、その名前を出力します。

が、私はこのプログラムを実行すると、私は彼らのすべてが最後のボタンの名前を返す

、すべてのボタンを押してください。

なぜこのことが起こるのだろうか。誰でも助けてくれる?私はあなたのコード内の少なくとも1個のバグを参照してください

python t.py 
DEBUG:root:c 
DEBUG:root:c 
DEBUG:root:c 

答えて

3

:よう

import sys 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
import logging 

logging.basicConfig(level=logging.DEBUG,) 

class MainWindow(QWidget): 
    def init(self): 
     names = ('a','b','c') 
     lo = QHBoxLayout(self) 
     for name in names: 
      button = QPushButton(name,self) 
      lo.addWidget(button) 
      self.connect(button,SIGNAL("clicked()"), 
         lambda :logging.debug(name)) 

if __name__=="__main__": 
    app = QApplication(sys.argv) 
    m = MainWindow();m.init();m.show() 
    app.exec_() 

結果。

は交換してください:

lambda :logging.debug(name) 

で:

lambda name=name: logging.debug(name) 

詳細はWhy results of map() and list comprehension are different?を参照してください。