Seite 1 von 1

Button verhalten seltam

Verfasst: Samstag 25. März 2023, 17:40
von Ernie1412
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 ?

Re: Button verhalten seltam

Verfasst: Samstag 25. März 2023, 17:52
von __blackjack__
@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.

Re: Button verhalten seltam

Verfasst: Samstag 25. März 2023, 18:11
von Ernie1412
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()"

Re: Button verhalten seltam

Verfasst: Samstag 25. März 2023, 18:23
von Sirius3
@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.

Re: Button verhalten seltam

Verfasst: Samstag 25. März 2023, 18:52
von __blackjack__
@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.