문제

나의 목록과 문자열을 원하는 메뉴를 만들에 대한 항목이 각각의 문자열입니다.를 클릭할 때의 항목 중 하나,항상 동일한 기능을 것이라고와 함께 문자열입니다.후에는 어떤 노력과 연구를 내놓았다가 다음과 같다:

import sys
from PyQt4 import QtGui, QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.menubar = self.menuBar()
        menuitems = ["Item 1","Item 2","Item 3"]
        menu = self.menubar.addMenu('&Stuff')
        for item in menuitems:
            entry = menu.addAction(item)
            self.connect(entry,QtCore.SIGNAL('triggered()'), lambda: self.doStuff(item))
            menu.addAction(entry)
        print "init done"

    def doStuff(self, item):
        print item

app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

지금 문제는 각 메뉴의 항목 인쇄 같은 출력:"3 항"대신에 해당 하나입니다.나는 감사에 대한 아이디어에 대해 나는 어떻게 얻을 수 있는데 이 부분이 중요합니다.감사합니다.

도움이 되었습니까?

해결책

파이썬의 "스코핑 문제"로 자주 언급 된 내용 (아마도 전적으로 성가신 것이 아닐 수도 있습니다 ;-)-바인딩은 늦었지만 (호출 시간에 대한 어휘 조회) 일찍 원하는 경우 ( def-time). 그래서 당신이 지금 가지고있는 곳 :

    for item in menuitems:
        entry = menu.addAction(item)
        self.connect(entry,QtCore.SIGNAL('triggered()'), lambda: self.doStuff(item))

대신 시도해보십시오.

    for item in menuitems:
        entry = menu.addAction(item)
        self.connect(entry,QtCore.SIGNAL('triggered()'), lambda item=item: self.doStuff(item))

이것은 기본값 값 ( item 여기 하나)) DEF- 시간에 한 번 AN을 계산하십시오. 한 레벨의 기능 중첩 (예 : 더블 람다)도 효과가 있지만 여기서는 약간의 과잉입니다!-)

대안 적으로 사용할 수 있습니다 functools.partial(self.doStuff, item) ( import functools 물론 맨 위에) 또 다른 훌륭한 솔루션이지만, 나는 가장 단순하고 가장 일반적인 "인수에 대한 가짜 기본 가치"관용구로 갈 것이라고 생각합니다.

다른 팁

이 일을 해야 하지만,저는 확신이 있었는 더 좋은 방법이 기억이 없어요 지금이다.

def do_stuff_caller(self, item):
    return lambda: self.doStuff(item)

...
self.connect(entry, QtCore.SIGNAL('triggered()'), self.do_stuff_caller(item))

편집:짧은 버전,는 여전히지 않은 나는에 대해 생각하고 무엇을...또는 어쩌면 그것은 다른 언어?:)

(lambda x: lambda self.do_stuff(x))(item)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top