Seite 1 von 1

Nach Countdown Kommando ausführen

Verfasst: Samstag 10. April 2010, 11:28
von elactic
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

Re: Nach Countdown Kommando ausführen

Verfasst: Samstag 10. April 2010, 12:23
von tordmor
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

Verfasst: Samstag 10. April 2010, 13:19
von yipyip
Du suchst wohl so etwas:
http://paste.pocoo.org/show/199965/

:wink:
yipyip

Re: Nach Countdown Kommando ausführen

Verfasst: Sonntag 11. April 2010, 18:20
von elactic
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 =)