Seite 1 von 1
Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Freitag 8. Januar 2021, 21:29
von 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
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Freitag 8. Januar 2021, 21:42
von pillmuncher
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.
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Samstag 9. Januar 2021, 02:47
von 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


Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Samstag 9. Januar 2021, 03:20
von __blackjack__
@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.
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Freitag 22. Januar 2021, 22:01
von __blackjack__
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()
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Samstag 23. Januar 2021, 00:51
von 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()
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Samstag 23. Januar 2021, 07:44
von Sirius3
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.
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Samstag 23. Januar 2021, 20:45
von anonym113
Re: Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
Verfasst: Sonntag 24. Januar 2021, 05:23
von __blackjack__
@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?