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
Button erst wieder drücken können, wenn der Prozess dahinter beendet ist
- 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.
Verzeih mir, das habe ich komplett vergessen xDpillmuncher 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.
Ich mache ein GUI mit dem Framework Tkinter auf Windows 10
- __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
- __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
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'
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()
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.
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.
- __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?
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