我目前正在使用PyQt 5和Python 3.5开发桌面应用程序。最近,我在尝试动态添加按钮到布局时遇到了一个问题。这就是我在做的事情:
for i in range(len(movieList)):
movies[i][0] = QtWidgets.QLabel("Title: " + movieList[i][0])
movies[i][0].setGeometry(30, 50, 15, 20)
movies[i][0].setFont(self.movieTitleFont)
self.scrollLayout.addRow(movies[i][0])
#If the lenght is 3 it means it has 2 available resolutions
if len(movieList[i]) == 3:
movies[i][1] = [QtWidgets.QPushButton(movieList[i][1][1], self), QtWidgets.QPushButton(movieList[i][2][1], self)]
movies[i][1][0].clicked.connect(lambda: self.downloadMovie(movieList[i], movieList[i][1][1]))
movies[i][1][0].setGeometry(0, 0, 10, 20)
movies[i][1][1].clicked.connect(lambda: self.downloadMovie(movieList[i], movieList[i][2][1]))
movies[i][1][1].setGeometry(10, 0, 10, 20)
self.scrollLayout.addRow(movies[i][1][0])
self.scrollLayout.addRow(movies[i][1][1])
else:
movies[i][1] = [QtWidgets.QPushButton(movieList[i][1][1], self)]
movies[i][1][0].clicked.connect(lambda: self.downloadMovie(movieList[i], movieList[i][1][1]))
movies[i][1][0].setGeometry(30, 50, 10, 20)
self.scrollLayout.addRow(movies[i][1][0])
我遇到的问题是,每当所有电影都加载到我的屏幕上并且我尝试按下其中一个按钮来下载所述电影时,它只会将最后一个值“i”存储起来(在clicked.connect中)所以它将尝试下载显示的最后一部电影。我一直在努力寻找解决办法,但我找不到方法。
答案 0 :(得分:1)
我认为如果你改为局部,那么一切都会好起来的
from functools import partial
...
for i in range(len(movieList)):
movies[i][0] = QtWidgets.QLabel("Title: " + movieList[i][0])
movies[i][0].setGeometry(30, 50, 15, 20)
movies[i][0].setFont(self.movieTitleFont)
self.scrollLayout.addRow(movies[i][0])
#If the lenght is 3 it means it has 2 available resolutions
if len(movieList[i]) == 3:
movies[i][1] = [QtWidgets.QPushButton(movieList[i][1][1], self), QtWidgets.QPushButton(movieList[i][2][1], self)]
movies[i][1][0].clicked.connect(partial( self.downloadMovie,movieList[i], movieList[i][1][1]))
movies[i][1][0].setGeometry(0, 0, 10, 20)
movies[i][1][1].clicked.connect(partial( self.downloadMovie,movieList[i], movieList[i][2][1]))
movies[i][1][1].setGeometry(10, 0, 10, 20)
self.scrollLayout.addRow(movies[i][1][0])
self.scrollLayout.addRow(movies[i][1][1])
else:
movies[i][1] = [QtWidgets.QPushButton(movieList[i][1][1], self)]
movies[i][1][0].clicked.connect(partial( self.downloadMovie,movieList[i], movieList[i][1][1]))
movies[i][1][0].setGeometry(30, 50, 10, 20)
self.scrollLayout.addRow(movies[i][1][0])