Nach Countdown Kommando ausführen

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
elactic
User
Beiträge: 18
Registriert: Mittwoch 16. Dezember 2009, 14:49

Samstag 10. April 2010, 11:28

Hallo zusammen,
ich möchte ein Programm schreiben, das mir meinen Rechner automatisch herunterfährt. Ich möchte den Modus, die Zeit usw einstellen können und daraus dann den Befehl 'shutdown -s -f -t 0 -m \\computername ausführen.
Das klappt alles, ich habe das jetzt in eine Tkinter GUI gepackt, alles kein Problem.
Was ich allerdings nicht hinbekomme, ist den Befehl erst nach einer bestimmten Zeit auszuführen, so wie bei einem countdown.
Ich habe mich schon durch diverse Artikel gequält, wobei die meisten sagen dass die einfachste Variante einen Befehl zu Verzögern time.sleep() ist.
Das bekomme ich nicht hin, da passieren komische Sachen:
Wenn ich zum testen des ganzen sowas extrem einfaches mache, wie

Code: Alles auswählen

for i in range(5):
   print i
sleep(1)
for i in range(5,10):
   print i
dan hört er schon bei der 3 an zu warten... liegt das daran dass ich 2 prozessoren laufen habe?
naja ist ja auch egal
was ich eigentlich möchte ist, dass ein label erstellt wird in dem die zeit runtergezählt wird.
das habe ich ungefähr so gemacht

Code: Alles auswählen

            for i in range(int(self.zeit.get()),0,-1):         # self.zeit ist die zeit die abgewartet werden soll
                self.timer.set(i)                              # self.timer ist das label in dem die zeit angezeigt werden soll
                sleep(1)
Wenn ich das jetzt ausführe, dann dauert das x sekunden und dann wird das label erstellt wo nurnoch 1 drinsteht.
überall wo ich mal nachgeschaut habe, wurden in countdownscripts mit sleep gearbeitet...
immerwieder habe ich auch gelsesen, dass sleep halt alles blockiert (was ja eigentlich egal sein sollte, weil ich ja mit ner schleife arbeite) und dass man deshalb lieber tk.after(ms,func) benutzen soll, habe ich auch versucht

Code: Alles auswählen

            for i in range(int(self.zeit.get()),0,-1):
                self.master.after(self.zeit.get()*1000,self.timer.set(i))
führt aber zum selben problem, der befehl wird nach der angegebenen zeit ausgeführt, aber das mit der gui klappt nicht

habt ihr vllt eine idee wie ich das verbessern kann?
ich bin noch schüler und noch nicht lange bei python, kenn mich also nicht soo gut aus...
lg
johannes
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

Samstag 10. April 2010, 12:23

elactic hat geschrieben:

Code: Alles auswählen

 self.master.after(self.zeit.get()*1000,self.timer.set(i))
Die Zeile bedeutet, rufe self.timer.set(i) sofort auf und was auch immer diese Funktion zurückliefert nach ein paar Sekunden.
Lösungsmöglichkeiten:
1. Funktion, die eine Funktion zurückliefert
2. Lambda
3. funcools.partial
http://www.felix-benner.com
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Samstag 10. April 2010, 13:19

Du suchst wohl so etwas:
http://paste.pocoo.org/show/199965/

:wink:
yipyip
elactic
User
Beiträge: 18
Registriert: Mittwoch 16. Dezember 2009, 14:49

Sonntag 11. April 2010, 18:20

Die Zeile bedeutet, rufe self.timer.set(i) sofort auf und was auch immer diese Funktion zurückliefert nach ein paar Sekunden.
Lösungsmöglichkeiten:
1. Funktion, die eine Funktion zurückliefert
2. Lambda
3. funcools.partial
ich habs jetzt so ähnlich gemacht wie von yipyip empfohlen. deine tipps haben zwar sinn gemacht aber leider nicht funktioniert =( die rückgabe werte waren irgendwie ... unschön

danke aber für eure hilfe =)
Antworten