我正在尝试在循环内创建函数并将它们存储在字典中.问题是字典中的所有条目似乎最终都映射到最后创建的函数.代码如下:
functions = []
for i in range(3):
def f():
return i
# alternatively: f = lambda: i
functions.append(f)
Run Code Online (Sandbox Code Playgroud)
这输出:
print([f() for f in functions])
# expected output: [0, 1, 2]
# actual output: [2, 2, 2]
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
我已设置ui->tabWidget->setTabsClosable(true);但QTabwidget只在每个选项卡上显示一个十字架,而不是在单击此按钮时关闭选项卡.还有什么办法可以让标签关闭?我试图连接任何接近信号的插槽(这对于这项工作是合适的)tabCloseRequested(int)但在tabwidget中找不到任何这样的插槽.请建议正确的方法.
我已经准备了很多关于如何在 python 和 pyqt 中将多个信号连接到同一个事件处理程序的帖子。例如,将多个按钮或组合框连接到同一功能。
许多示例展示了如何使用 QSignalMapper 执行此操作,但是当信号携带参数时不适用,例如 combobox.currentIndexChanged
许多人建议它可以用 lambda 来制作。这是一个干净漂亮的解决方案,我同意,但没有人提到 lambda 创建了一个闭包,其中包含一个引用 - 因此无法删除被引用的对象。你好内存泄漏!
证明:
from PyQt4 import QtGui, QtCore
class Widget(QtGui.QWidget):
def __init__(self):
super(Widget, self).__init__()
# create and set the layout
lay_main = QtGui.QHBoxLayout()
self.setLayout(lay_main)
# create two comboboxes and connect them to a single handler with lambda
combobox = QtGui.QComboBox()
combobox.addItems('Nol Adyn Dwa Tri'.split())
combobox.currentIndexChanged.connect(lambda ind: self.on_selected('1', ind))
lay_main.addWidget(combobox)
combobox = QtGui.QComboBox()
combobox.addItems('Nol Adyn Dwa Tri'.split())
combobox.currentIndexChanged.connect(lambda ind: self.on_selected('2', ind))
lay_main.addWidget(combobox)
# let the handler show …Run Code Online (Sandbox Code Playgroud) 我有几个小部件将连接到需要额外参数的单个函数。
我发现我可以使用 lambda 函数来向函数传递一些参数。
问题是参数在循环中被替换,而 lambda 函数只传递最后一组。
这是我得到的:
self.widgets是一个带有按钮组键的字典,为了简短起见,假设它有 2 个按钮 [QToolButton],链接到它们的键:“播放”和“停止”。
def connections(self):
for group in self.widgets:
self.widgets[group].clicked.connect(lambda: self.openMenu(group))
def openMenu(self,group):
print group
Run Code Online (Sandbox Code Playgroud)
但是无论我点击哪个按钮,它都会打印同一个组,即在 for 循环中迭代的最后一个组。
有任何解决这个问题的方法吗?
我是 pyqt 的新手(Maya 中的 pyside),请对我好一点:)
所以关键是我想通过循环语句生成许多按钮,类似于下面的东西:
(窗口中的 5 个按钮 - 完整代码 - 玛雅)
import PySide.QtCore as qc
import PySide.QtGui as qg
class simpleUI(qg.QDialog):
def __init__(self):
qg.QDialog.__init__(self)
self.setWindowTitle('Simple UI')
self.btn=[]
for x in range(5) :
self.btn.append(x)
self.btn[x]= qg.QPushButton(self)
self.btn[x].setText('this is btn number{0}'.format(x))
self.btn[x].setGeometry(qc.QRect(0,100+(x*20), 100,20))
self.btn[x].clicked.connect(lambda : self.notifyMe(x))
def notifyMe(self,index):
print index
dialog = simpleUI()
dialog.show()
Run Code Online (Sandbox Code Playgroud)
如您所见,我将按钮对象存储在数组中,但问题是当我想将 btn 信号与notifyMe 函数连接时,每个按钮总是给出 x 相同的值 (x=4),同时在button.setText x 成功给出唯一的增量值,我不明白为什么..