을 만들 PyQt 메뉴 목록에서의 문자열
-
11-09-2019 - |
문제
나의 목록과 문자열을 원하는 메뉴를 만들에 대한 항목이 각각의 문자열입니다.를 클릭할 때의 항목 중 하나,항상 동일한 기능을 것이라고와 함께 문자열입니다.후에는 어떤 노력과 연구를 내놓았다가 다음과 같다:
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)
제휴하지 않습니다 StackOverflow