dancer_69 Δημοσ. 13 Ιουλίου 2019 Δημοσ. 13 Ιουλίου 2019 (επεξεργασμένο) Χρησιμοποιώ τη λειτουργία αποθήκευσης/επαναφοράς ρυθμίσεων για την κατάσταση των radiobuttons, ώστε να εκτελεστεί μια ενέργεια στην περίπτωση που κάποιο από αυτά είναι επιλεγμένο. Το πρόβλημα είναι ότι η ενέργεια δεν εκτελείται αν πρώτα δεν επιλέξω εγώ κάποιο από αυτά χειροκίνητα. Δηλαδή αν ανοίξω την εφαρμογή χωρίς να ενεργοποιήσω κάποιο από αυτά, παρότι έχει αποθηκευτεί και επαναφερθεί η τιμή που είχαν δεν εκτελείται η ενέργεια. Συγκεκριμένα, τα radiobuttons δεν είναι στο κεντρικό παράθυρο της εφαρμογής αλλά σε άλλο που εμφανίζεται με το πάτημα ενός κουμπιού του κεντρικού παραθύρου. Η κατάσταση τους αποθηκεύεται με το κλείσιμο της εφαρμογής. Στο κεντρικό παράθυρο έχω μια συνθήκη που ελέγχει πιο είναι επιλεγμένο και εκτελεί την αντίστοιχη ενέργεια. def actionChoosed(self): #if self.actionLbl.text() == self.tr("Shutdown Computer"): if self.settings.value("shutRbox", None)==True: #Actions.Shutcmd(self) print("True, Going to shutdown...") #elif self.actionLbl.text() == self.tr("Logout User"): elif self.settings.value("logoutRbox", None)==True: Actions.Logoutcmd(self) #elif self.actionLbl.text() == self.tr("Reboot Computer"): elif self.settings.value("rebRbox", None)==True: Actions.Rebcmd(self) #elif self.actionLbl.text() == self.tr("Hibernate Computer"): elif self.settings.value("hiberRbox", None)==True: Actions.Hibercmd(self) #elif self.actionLbl.text() == self.tr("Suspend Computer"): elif self.settings.value("suspRbox", None)==True: Actions.Suspcmd(self) #elif self.actionLbl.text() == self.tr("Countdown Timer"): elif self.settings.value("timerRbox", None)==True: QSound.play(":/ui/resources/sounds/alert.wav") self.timerDialog() else: print("nothing to do here!!!") Κατά τη δημιουργία του παραθύρου χρησιμοποιώ την print για να ελέγξω την κατάσταση ενός radiobutton. Είναι το πρώτο από αυτά της "actionChoosed" όπου κι εκεί έχω άλλη μια print, όπως φαίνεται παραπάνω. super(MainWindow, self).__init__(parent) self.setupUi(self) self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) print(self.settings.value("shutRbox", None) output: true Αν και η print εμφανίζει τη σωστή τιμή για το κουμπί(true) όταν ξεκινάει η εφαρμογή(αν ανοίξω το αρχείο ρυθμίσεων με κάποιο κειμενογράφο, υπάρχει και εκεί η καταχώρηση με τη σωστή τιμή, όπως είναι αναμενόμενο), δεν εκτελείται η ενέργεια της "if" αλλά τυπώνεται το μήνυμα που υπάρχει στην "else" . Μόλις ανοίξω το παράθυρο και επιλέξω το κουμπί(το οποίο είναι ήδη τσεκαρισμένο) και το κλείσω, τότε λειτουργεί η παραπάνω συνθήκη σωστά. Όχι όμως αν δεν κάνω αυτή την ενέργεια χειροκίνητα., όσες φορές κι αν την εκτελέσω(Η "actionChoosed" εκτελείται με το πάτημα ενός κουμπιού επίσης). Τι έχω κάνει λάθος? Επεξ/σία 13 Ιουλίου 2019 από dancer_69
lefwiz Δημοσ. 13 Ιουλίου 2019 Δημοσ. 13 Ιουλίου 2019 Σε ποιο σημείο του κώδικα αρχικοποιείς την self.settings.value?
dancer_69 Δημοσ. 13 Ιουλίου 2019 Μέλος Δημοσ. 13 Ιουλίου 2019 Στην αρχή της κλάσης: class MainWindow(QMainWindow, Ui_MainWindow): """ Class documentation goes here. """ faulthandler.enable() settings = QSettings("company", "SShutdn") def __init__(self, parent=None): """ Constructor @param parent reference to the parent widget @type QWidget """ super(MainWindow, self).__init__(parent) self.setupUi(self) self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
lefwiz Δημοσ. 13 Ιουλίου 2019 Δημοσ. 13 Ιουλίου 2019 (επεξεργασμένο) 13 ώρες πριν, dancer_69 είπε print(self.settings.value("shutRbox", None) έχω την εντύπωση ότι σου επιστρέφει <str> ενώ στη μέθοδο actionChoosed πας να τσεκάρεις αν είναι boolean. 13 ώρες πριν, dancer_69 είπε def actionChoosed(self): #if self.actionLbl.text() == self.tr("Shutdown Computer"): if self.settings.value("shutRbox", None)==True: #Actions.Shutcmd(self) print("True, Going to shutdown...") Τσέκαρέ το μια... βάζοντας αυτάκια στη συνθήκη =="true" ή self.settings.value("shutRbox", None, type=bool) Κάτι άλλο δεν μου έρχεται στο μυαλό. Επεξ/σία 13 Ιουλίου 2019 από lefwiz
dancer_69 Δημοσ. 14 Ιουλίου 2019 Μέλος Δημοσ. 14 Ιουλίου 2019 Ναι, αυτό φαίνεται πως ήταν. Δε δοκίμασα τα αυτάκια(νομίζω το είχα δοκιμάσει χθες αυτό), αλλά κατευθείαν να ορίσω τον τύπο, και δούλεψε. Ευχαριστώ. 1
dancer_69 Δημοσ. 14 Ιουλίου 2019 Μέλος Δημοσ. 14 Ιουλίου 2019 Αν και είναι διαφορετική ερώτηση, μιας και αφορά το ίδιο κομμάτι κώδικα που έχω παραθέσει, την κάνω εδώ για να μην ανοίγω άλλο θέμα. Υπάρχει κάποιος πιο μαζεμένος τρόπος να πετύχω την ίδια λειτουργικότητα χωρίς την χρήση των if/elif, ώστε να χρειαστούν λιγότερες γραμμές κώδικα?
pmav99 Δημοσ. 14 Ιουλίου 2019 Δημοσ. 14 Ιουλίου 2019 Μπορείς να κάνεις abuse τα dictionaries https://alysivji.github.io/quick-hit-dictionary-dispatch.html
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα