Skonfigurowany радиобуттон innej grupy pyqt

0

Pytanie

Mam 2 przełączniki, utworzone (wewnątrz klasy QMainWindow), takie jak:

    def dtype_radiobuttons(self):
        layout = QHBoxLayout()
        rb1 = QRadioButton("complex")
        rb1.toggled.connect(lambda: self.update_image("dtype", rb1.text()))


        self.real_dtype_rb = QRadioButton("real", self)
        self.real_dtype_rb.toggled.connect(lambda: self.update_image("dtype", self.real_dtype_rb.text()))

        self.btngroup.append(QButtonGroup())
        self.btngroup[-1].addButton(self.real_dtype_rb)
        self.btngroup[-1].addButton(rb1)

        rb1.setChecked(True)
        layout.addWidget(rb1)
        layout.addWidget(self.real_dtype_rb)
        layout.addStretch()

        return layout

    def library_radiobutton(self):
        layout = QHBoxLayout()
        self.cvnn_library_rb = QRadioButton("cvnn", self)
        self.cvnn_library_rb.toggled.connect(lambda: self.update_image("library", self.cvnn_library_rb.text()))

        rb2 = QRadioButton("tensorflow", self)
        rb2.toggled.connect(lambda: self.update_image("library", rb2.text()))

        self.btngroup.append(QButtonGroup())
        self.btngroup[-1].addButton(rb2)
        self.btngroup[-1].addButton(self.cvnn_library_rb)

        self.cvnn_library_rb.setChecked(True)
        layout.addWidget(self.cvnn_library_rb)
        layout.addWidget(rb2)
        layout.addStretch()

        return layout

Chcę zrobić niemożliwe wybór complex opcja grupy przełączników i dtype tensorflow радиобуттон bibliotecznych радиобуттонов. Pozostawiając 3 z 4 możliwych kombinacji. Dlatego, jeśli wybiorę complex i biblioteka była tensorflowChcę się automatycznie zmienić na bibliotekę cvnn. Próbowałem zrealizować to tak:

    def update_image(self, key, value):
        if value == "complex":
            if hasattr(self, 'cvnn_library_rb'):    # It wont exists if I still didnt create the radiobutton.
                self.cvnn_library_rb.setChecked(True)   # Set library cvnn
        elif value == "tensorflow":
            if hasattr(self, 'real_dtype_rb'):
                self.real_dtype_rb.setChecked(True)   # Set real dtype
        ... Do the other stuff I need to do.

Dziwne jest to, że to rzeczywiście działa w tym sensie, że, na przykład, jeśli jestem na complex aktywowany i wybierz tensorflow, радиобуттон zmienia się na real (czego chcę!) ale tensorflow nie wybiera! Muszę wybrać go ponownie, jakby co self.real_dtype_rb.setChecked(True) anuluje wybór radia, na który kliknąłem. (Bardzo dziwne, jeśli o mnie).


  • To hasattr jest używany, ponieważ w zależności od kolejności, w której dzwonię funkcje, niektóre przełączniki zostaną utworzone wcześniej innych, więc może nie istnieć.

  • Ten jest to wariant, który biorę pod uwagę, ale on wyłącza grupę radiobutton zamiast zmiany ich stanu (nie to, że wolę).

pyqt python qt
2021-11-23 08:48:26
1

Najlepsza odpowiedź

1

Sygnał toggled działa za każdym razem, gdy zmieniasz stan swoich przełączników. W ten sposób zostanie on aktywowany, kiedy zadzwonić setChecked (raz przełącznik, który przełącza, i raz do innego, który można odłączać) i update_image nazywa się to złym wydarzeniem.

Należy sprawdzić stan przełącznika i zadzwonić update_image tylko jeśli przełącznik jest włączony:

rb2.toggled.connect(lambda state: state and self.update_image("library", rb2.text(), state))
2021-11-23 10:45:03

To zadziałało! Dziękuję!
Agustin Barrachina

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................