Button verhalten seltam

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich hab eine Funktion die mit self.Transfer.btn_OK_exif.clicked.connect(lambda: self.ordner_transfer_zurueck(True)) endet. in der Funtion rufe ich eine file_rename funktion auf. wenn ich nun zum 2. mal die Funtion ordner_--- aufrufe ruft er auch 2 mal die funtion auf. beim 3,. mal 3 mal. warum ?
die self.Transfer.btn_OK_exif.clicked.connect(lambda: self.ordner_transfer_zurueck(True)) ist eine finish funktion eines qthreads ?

hier die Funtion ordner_...

Code: Alles auswählen

    def ordner_transfer_zurueck(self,save):
        self.Transfer.hide()
        if save:
            process_output = json.loads(PROCESS_JSON_PATH.read_bytes())         
            if self.rdBtn_rename.isChecked():
                errview=self.file_rename(self.lbl_Ordner.text(),process_output["old_file"],"")                           
            else:                
                errview=self.file_rename(self.lbl_Ordner.text(),process_output["old_file"],process_output["new_file"]) 
            isda=self.addPerformer_wenn_da()                
            self.StatusBar(f"Fertig ! / {process_output['stderr']} / Es sind {isda} Darsteller in die DB hinzugefügt worden","#f3f0ff")
        else:
            db_webside_settings = Webside_Settings()
            ...
hier die entscheidene Teil der file_rename funktion:

Code: Alles auswählen

if new_file=="":                
                new_file=side+self.unicode_filter(self.darsteller_zusammen().replace("(m)","").replace(z,""))+strich+self.unicode_filter(titel+neben_side)+".mp4"                
                process_output=json.loads(PROCESS_JSON_PATH.read_bytes())
                process_output["new_file"]=new_file
                json.dump(process_output,open(SELF_PATH / "JSON/Process.json",'w'),indent=4, sort_keys=True)
                self.Transfer.lbl_Dest_Folder.setText(f"<br>Neuer Dateiname: {new_file}")                                         
            try:                                                
                Path(Path(directory) / Path(old_file)).rename(Path(directory) / Path(new_file))
            except OSError as err:
                ...u.s.w.
nach mehr als einmal Aufruf. gibt er immer ein except ...
Er benennt die Datei wie gewünscht um, geht aber wohl die wieder zurück zu self.Transfer.btn_OK_exif.clicked.connect(lambda: self.ordner_transfer_zurueck(True)). ruft es erneut auf, aber new_file ist " - .mp4" und kann es nicht umbennen. Beim 3. aufruf macht er es 2 mal usw.
warum geht er denn zum clicked.connect immer zurück ?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Der entscheidende Teil ist nicht zu sehen. Nämlich da wo ``self.Transfer.btn_OK_exif.clicked.connect(lambda: self.ordner_transfer_zurueck(True))`` aufgerufen wird, beziehungsweise wo/wie oft die Methode aufgerufen wird, wo das ausgeführt wird. Das erstellt ja eine anonyme Funktion und verbindet die mit dem `clicked`-Signal. Und zwar jedes mal wenn das ausgeführt wird. Entsprechend oft, weil entsprechend viele anonyme Funktionen werden dann auch bei dem `clicked`-Signal ausgeführt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Ernie1412
User
Beiträge: 161
Registriert: Freitag 10. Januar 2020, 20:38

ich hab das nun so geregelt:

Code: Alles auswählen

if not self.transfer_ok_button:
            self.Transfer.btn_OK_exif.clicked.connect(lambda: self.Ordner_Transfer_Zurueck(True))
            self.transfer_ok_button = True
in der _init_
self.transfer_ok_button = False

damit gehts wohl. ich möchte das nur noch verstehen warum genau ? Warum geht er immer wieder zurück zum Button Aufruf und nicht von Zeile zur nächsten Zeile nach einmaligen Aufruf. Läuft das Warten auf den Button immer parallel zum Programmablauf auch wenn der Button garnicht mehr zu sehen ist ? siehe "self.Transfer.hide()"
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ernie1412: Du Groß-Kleinschreibung Deiner Namen hält sich an keine Konvention. Das solltest Du einheitlich machen. Die Mischung von Deutsch und Englisch ist auch schwierig zu verstehen.
Benutze keine kryptischen Abkürzungen wie lbl oder btn oder rdBtn.
Ein Label sollte keine Informationen enthalten, die das Programm wieder ausliest. Der Aufruf von file_rename sollte nur einmal im Code vorkommen.

Code: Alles auswählen

    def ordner_transfer_zurueck(self, save):
        self.Transfer.hide()
        if save:
            process_output = json.loads(PROCESS_JSON_PATH.read_bytes())         
            newfile = None if self.radiobutton_rename.isChecked() else process_output["new_file"]
            errview = self.file_rename(self.ordner, process_output["old_file"], newfile)
            number_of_performers = self.add_performers()                
            self.StatusBar(f"Fertig ! / {process_output['stderr']} / Es sind {number_of_performers} Darsteller in die DB hinzugefügt worden","#f3f0ff")
        else:
            db_webside_settings = Webside_Settings()
Wenn ein Wert keinen Inhalt hat, dann benutzt man None und nicht "". Strings stückelt man nicht mit + zusammen, sondern nimmt f-Strings. `z` ist absolut kein guter Variablenname.
Dateien, die man öffnet, muß man auch wieder schließen.
`directory` sollte schon ein Path-Objekt sein, dann kann man sich die vielen `Path`-Aufrufe sparen.

Code: Alles auswählen

            if new_file is None:
                darsteller = self.unicode_filter(self.darsteller_zusammen().replace("(m)", "").replace(z, ""))
                title = self.unicode_filter(titel + neben_side)
                new_file = f"{side}{darsteller}{strich}{title}.mp4"
                process_output = json.loads(PROCESS_JSON_PATH.read_bytes())
                process_output["new_file"] = new_file
                (SELF_PATH / "JSON/Process.json").write_text(json.dumps(process_output, indent=4, sort_keys=True))
                self.Transfer.lbl_Dest_Folder.setText(f"<br>Neuer Dateiname: {new_file}")                                         
            try:                                                
                (directory / old_file).rename(directory / new_file)
            except OSError as err:
                ...u.s.w.
Der connect-Aufruf sollte direkt in der __init__ stehen, und nicht irgendwo anders im Code, wo man statt dessen eine Würgaround mit einem Flag braucht.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: ”Er” geht nirgends zurück. Wenn Du einen Button mit mehreren Funktionen verbindest, werden die alle aufgerufen. Das ist auch nicht wirklich seltsam. Ein Signal kann mit mehrfach verbunden werden. Bei einem `connect()`-Aufruf wird eine eventuell vorhandene vorherige Verbindung nicht ersetzt, sondern eine neue, zusätzliche erstellt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten