2016-06-17 11 views
1

Ich entwickle derzeit eine Desktop-Anwendung mit PyQt 5 und Python 3.5. In letzter Zeit ist ein Problem beim dynamischen Hinzufügen von Schaltflächen zu einem Layout aufgetreten. Hier ist, was ich tue:Python - Hinzufügen von Schaltflächen zum Layout in PyQt

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

Das Problem, das ich habe, ist, dass, wenn alle Filme in meinem Bildschirm geladen werden, und ich versuche, eine der Tasten zu drücken, sagte Film zum Download es wird nur den letzten Wert nehmen „i "gespeichert (in clicked.connect), so wird es versuchen, den zuletzt gezeigten Film herunterzuladen. Ich habe kaum daran gearbeitet, einen Workaround zu finden, aber ich habe den Weg nicht gefunden.

Antwort

1

Ich denke, wenn Sie teilweise ändern dann alle

gut funktionieren wird
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]) 
+0

Vielen Dank !! Es hat gut funktioniert! – Guido

+0

Kein Problem und wenn Sie mehr darüber wissen möchten, besuchen Sie diese http://stackoverflow.com/questions/11828410/differences-between-functools-partial-and-a-similar-lambda – Achayan

+0

Großartig! Werde es ausprobieren! Vielen Dank :) – Guido