Buttons verknüpfen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
-Passi-
User
Beiträge: 17
Registriert: Mittwoch 11. November 2020, 23:12

Ich möchte aus den Items in einer Liste Buttons erstellen. Das Funktioniert auch soweit ABER die Buttons sollen bei der Funktion als Übergabewert den gleichen haben wie beim Namen, aber irgendwie überschreiben diese sich immer und so haben am ende zwar alle den Passenden Namen, aber bei der Funktion überschreibt sich das immer, sodass alle Buttons am ende den gleichen übergabewert haben.
Hat da wer eine Lösung für?

Code: Alles auswählen

   def create_account_grid(self):
        accounts = self.controller.datenbank_ansicht(self)
        button_content = []
        posistions = [(row, column) for row in range(len(accounts)) for column in range(3)]
        for pos, accounts in zip(posistions, accounts):
            buttons = QPushButton(accounts[0])
            buttons.clicked.connect(lambda: self.account_read(accounts[0]))
            button_content.append(buttons)
            buttons.setMinimumSize(QSize(0, 85))
            self.ui.gridLayout_7.addWidget(buttons, *pos)
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@-Passi-: Da kann was nicht stimmen. `posistions` (sic!) ist 3× so lang wie `accounts`, durch das `zip()` werden wird dann aber nur das erste drittel von `posistions` verwendet. Das macht nicht wirklich Sinn.

Dann verwendest Du den Namen `accounts` für naja die Accounts *und* in der Schleife dann noch mal für *einen* Account. Willst Du da nur andere Leser verwirren oder Dich auch selbst aufs Glatteis führen? Und auch `buttons` ist nicht der richtige Name für *einen* Button.

Ich vermute mal das sollte in diese Richtung gehen:

Code: Alles auswählen

from functools import partial

...

    def create_account_grid(self):
        buttons = []
        for row, account in enumerate(self.controller.datenbank_ansicht(self)):
            button = QPushButton(account)  # TODO Das sieht falsch aus‽
            button.clicked.connect(partial(self.account_read, account))
            button.setMinimumSize(QSize(0, 85))
            self.ui.gridLayout_7.addWidget(button, row, 0)
            buttons.append(button)

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
-Passi-
User
Beiträge: 17
Registriert: Mittwoch 11. November 2020, 23:12

Danke für die schnelle Hilfe :D

Habe meinen Ansatz und deine Hilfe ein bisschen verschmolzen und jetzt liefert es die Richtigen Ergebnisse.

Hier die Lösung, falls jemand ein ähnliches Problem hat:

Code: Alles auswählen

from functools import partial

...

    def create_account_grid(self):
        content = self.controller.datenbank_ansicht(self)
        posistions = [(row, column) for row in range(math.ceil(len(content) / 3)) for column in range(3)]
        print(posistions)

        for pos, account in zip(posistions, content):
            button = QPushButton(account[0])
            button.clicked.connect(partial(self.account_read, account[0]))
            button.setMinimumSize(QSize(0, 85))
            self.ui.gridLayout_7.addWidget(button, *pos)
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich frage mich noch immer was `posistions` sind? Hat das irgend etwas mit Positionen zu tun?
Auch dafür würde man erst enumerate benutzen, und dann aus dem Index row und column berechnen:

Code: Alles auswählen

    def create_account_grid(self):
        content = self.controller.datenbank_ansicht(self)
        for pos, account in enumerate(content):
            row, column = divmod(pos, 3)
            button = QPushButton(account[0])
            button.clicked.connect(partial(self.account_read, account[0]))
            button.setMinimumSize(QSize(0, 85))
            self.ui.gridLayout_7.addWidget(button, row, column)
-Passi-
User
Beiträge: 17
Registriert: Mittwoch 11. November 2020, 23:12

Die `posistions` sind dafür da, dass immer 3 Buttons in eine Reihe gepackt werden, ist wichtig für das Gridlayout.
Deine Lösung funktioniert aber auch und ist definitiv schöner ;D
Antworten