我目前正在使用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中),因此它将尝试下载显示的最后一部电影。我一直在努力寻找解决方法,但是还没有找到方法。

最佳答案

我认为,如果您更改为部分,那么一切都会很好

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])

关于python - Python-将按钮动态添加到PyQt中的布局,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37891774/

10-14 20:19
查看更多