Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Χρησιμοποιώ τη λειτουργία αποθήκευσης/επαναφοράς ρυθμίσεων για την κατάσταση των 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" εκτελείται με το πάτημα ενός κουμπιού επίσης).

Τι έχω κάνει λάθος? 

Επεξ/σία από dancer_69
Δημοσ.

Στην αρχή της κλάσης:

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)

 

Δημοσ. (επεξεργασμένο)
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)
Κάτι άλλο δεν μου έρχεται στο μυαλό.

 

Επεξ/σία από lefwiz
Δημοσ.

Ναι, αυτό φαίνεται πως ήταν.

Δε δοκίμασα τα αυτάκια(νομίζω το είχα δοκιμάσει χθες αυτό), αλλά κατευθείαν να ορίσω τον τύπο, και δούλεψε. 

Ευχαριστώ.

  • Like 1
Δημοσ.

Αν και είναι διαφορετική ερώτηση, μιας και αφορά το ίδιο κομμάτι κώδικα που έχω παραθέσει, την κάνω εδώ για να μην ανοίγω άλλο θέμα.

Υπάρχει κάποιος πιο μαζεμένος τρόπος να πετύχω την ίδια λειτουργικότητα χωρίς την χρήση των if/elif, ώστε να χρειαστούν λιγότερες γραμμές κώδικα?

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...