Button erst wieder drücken können, wenn der Prozess dahinter beendet ist

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anonym113

Also wie könnte ich einen Button erst wieder drücken, sodass der Prozess ausgeführt wird, wenn der laufende Prozess, der durch den gleichen Button ausgeführt wurde, beendet ist?

Die Funktion warten auf Prozess trifft es laut Recherche nicht.

Thx
query
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Im Web? In der GUI? Welches Framework nutzt du? Warum muss ich da erst nachfragen, das kannst du dir doch delber denken, dass deine Frage unbeantwortbar ist ohne diese Informationen.
In specifications, Murphy's Law supersedes Ohm's.
anonym113

pillmuncher hat geschrieben: Freitag 8. Januar 2021, 21:42 Im Web? In der GUI? Welches Framework nutzt du? Warum muss ich da erst nachfragen, das kannst du dir doch delber denken, dass deine Frage unbeantwortbar ist ohne diese Informationen.
Verzeih mir, das habe ich komplett vergessen xD
Ich mache ein GUI mit dem Framework Tkinter auf Windows 10😅😄
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@getQueryString: Man kann sich mit der `after()`-Methode auf Widgets was basteln was regelmässig mit der `poll()`-Methode auf dem `Popen`-Objekt prüft ob der Prozess beendet ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hach ganz vergessen ein Beispiel zu posten was hier in einem Tab im Editor vor sich hin gammelte. 🙂

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from subprocess import Popen


class MainWindow(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.button = tk.Button(self, text="Start", command=self.do_start)
        self.button.pack()
        self.process = None

    def _check_process(self, process):
        if process.poll() is None:
            self.after(100, self._check_process, process)
        else:
            self.button["state"] = tk.NORMAL

    def do_start(self):
        self.button["state"] = tk.DISABLED
        self._check_process(Popen(["sleep", "3"]))


def main():
    window = MainWindow()
    window.mainloop()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
anonym113

Ich habe jetzt folgenden Code geschrieben, aber ich bin wieder zu blöde.
Traceback (most recent call last):
File "C:\Users\x\workspace - PyCharm\HardwareInf\InfMain.py", line 261, in <module>
Settings()
File "C:\Users\x\workspace - PyCharm\HardwareInf\InfMain.py", line 207, in Settings
Tool.check_button = Button(Tool, text="Check Hardware", command=Tool.do_start, cursor="hand2", style="checkButton"
File "C:\Users\x\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 2346, in __getattr__
return getattr(self.tk, attr)
AttributeError: '_tkinter.tkapp' object has no attribute 'do_start'

Code: Alles auswählen

def __init__(Tool):
    __init__(Tool)
    Tool.check_button.pack()
    Tool.process = None


def check_process(Tool, process):
    if process.poll() is None:
        Tool.after(100, Tool.check_process, process)
    else:
        Tool.check_button["state"] = NORMAL


def do_start(Tool):
    Tool.check_button["state"] = DISABLED
    Tool.check_process(Popen(["sleep", "3"]))
    
    
def Settings():
    Tool.check_button = Button(Tool, text="Check Hardware", command=Tool.do_start, cursor="hand2", style="checkButton"
                                                                                                         ".TButton")
                                                                                                         
                                                                                                         
    Tool.mainloop()


if __name__ == "__main__":
    Settings()
    
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Da fehlen Codezeilen. Tool ist nicht definiert.
Es sieht so aus, als ob Du __blackjack__s Code verwenden wolltest, aber noch nicht gelernt hast, wie man Klassen definiert.
Das solltest Du als erstes nachholen und in Deinem Lehrbuch das Kapitel über OOP durcharbeiten.
anonym113

Code: Alles auswählen

https://pastebin.com/jfv4HVKu
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@getQueryString: Die Module `platform`, `datetime` aus `datetime`, `GPUtil`, und `psutil` werden importiert aber nirgends verwendet.

Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen. Man sieht hier beispielsweise nicht was aus `tkinter` kommt und was der spätere Sternchen-Import aus `ttk` davon dann wieder verdeckt.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

`winfo_reqwidth()` und `winfo_reqheight()` aufzurufen wo man doch kurz vorher diese Werte selbst gesetzt hat ist umständlicher als es sein müsste.

Die Positionsberechnung um das Fenster laut Kommentar zu zentrieren, haut ja nicht hin, und das da die Hälfte laut Kommentar berechnet wird in dem durch 3, 8, oder 4 geteilt wird, ist ja offensichtlich auch falsch.

Man pappt nicht einfach so irgendwelche Attribute an fremde Objekte. Das ist eine übliche Taktik bei `tk.PhotoImage`-Objekten weil die sonst verschwinden können wenn Python da keine Referenz mehr drauf hat, das ist aber eine absolute Ausnahme.

Man kann ja versuchen gegen die Namensschreibweise nach PEP8 zu argumentieren, aber das erste Argument bei Methoden anders als `self` zu nennen geht echt überhaupt gar nicht!

Die ganzen Funktionen auf Modulebene werden überhaupt nicht verwendet. Was soll das da alles?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten