Button-Klick Verhalten

Fragen zu Tkinter.
Antworten
Moneyman
User
Beiträge: 8
Registriert: Dienstag 12. Juni 2012, 10:02

Donnerstag 14. Januar 2016, 11:42

Hallo Community,

Ich habe ein Programm, welches das Netzwerk durchsucht und dafür eine Oberfläche erstellt. Für die GUI habe ich eine eigene Klasse erstellt. Wenn der Scan durch Klicken auf den "Run"-Button gestartet wird, soll dieser deaktiviert werden:

Code: Alles auswählen

self.runB = Tkinter.Button(self.top, text='Run', command= self.runScan)
self.runB.grid(row=7, column=0, sticky=W)

def runScan(self):
        self.startB = Tkinter.Label(self.top, text="Scan running...", justify=RIGHT).grid(row=7, column=0)
        self.runB['state'] = 'disabled'
        startScan(self.eTarget.get(), self.runB, self.everyoneC.get(), self.hiddenSC.get(), self.eThread.get(), self.filePathTk)
        self.startB = Tkinter.Label(self.top, text="Scan complete!", justify=RIGHT).grid(row=7, column=0)
        self.runB['state'] = 'normal'
Leider werden die Zeilen vor dem Aufruf "startScan()" nicht ausgeführt?! Auch der Button befindet sich während der Scan-Zeit im gedrückten Zustand und das Programm reagiert nicht mehr. Muss ich die startScan() Methode in einen eigenen Thread auslagern? (Verwende weitere Threads für den Scanvorgang)

Vielen Dank schon mal für die Hilfe!
BlackJack

Donnerstag 14. Januar 2016, 11:48

@Moneyman: Die Zeilen werden ausgeführt aber Tk kann erst wieder etwas machen wenn `runScan()` wieder zur Tk-Hauptschleife zurück kehrt.

Bei jedem Aufruf neue `Label`-Exemplare zu erstellen sieht merkwürdig bis falsch aus. Zumal die auch noch die Schaltfläche verdrängen würden. `None` an `self.startB` zu binden macht keinen Sinn und was soll der Name bedeuten? Bei Deinen Namen sind zu viele komische Abkürzungen. Und die Schreibweise entspricht nicht dem Style Guide for Python Code.
Moneyman
User
Beiträge: 8
Registriert: Dienstag 12. Juni 2012, 10:02

Donnerstag 14. Januar 2016, 12:03

Hi BlackJack,

danke für die erklärende Antwort! Ich war ein wenig zu vorschnell mit dem Code. Du hast natürlich recht, dass ein erneuter Aufruf von Lable total sinnfrei ist :roll: Ebenso der Variablennamen^^ Deinen Link werde ich mir da einmal zu Gemüte führen.

Hast du denn einen Lösungsvorschlag?
BlackJack

Donnerstag 14. Januar 2016, 12:37

@Moneyman: Den Lösungsansatz hattest Du im Grunde schon selber: Länger laufende Vorgänge muss man in der GUI-Programmierung entweder in einen Thread (oder Prozess) auslagern, oder so programmieren, dass man das Problem in kleine, schnell ausgeführte Schritte zerlegt, die regelmässig von der GUI-Hauptschleife angestossen werden können und so die Hauptschleife nicht für längere Zeit blockieren.
Antworten