Countdown, aber anders...

Du hast eine Idee für ein Projekt?
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Hey,
ich möchte ein Countdown Timer programmieren, aber nicht sowas wie es schon zu finden gibt sondern mit "genauer" Anzeige.
Ich möcht also sehen wie die Zahlen runter purzeln, hat da jemand eine Idee, ich trampel da ziemlich im dunkeln.

Best regards!
Benutzeravatar
phxx
User
Beiträge: 31
Registriert: Freitag 5. Mai 2006, 19:47

Was meinst du denn mit genauer Anzeige? Etwa auf millisekunden genau?

Erkläre das mal bitte etwas genauer =)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skypa hat geschrieben:Ich möcht also sehen wie die Zahlen runter purzeln
Hallo skypa!

Kein Countdown, aber ein Uhrenbeispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx
import time

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, title = "Time"):
        wx.Frame.__init__(self, parent, -1, title)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        self.anzeige = wx.StaticText(panel, size = (150, -1))
        vbox_main.Add(self.anzeige, 1, wx.EXPAND | wx.ALL, 10)
        
        self.timer = wx.Timer()
        self.timer.Bind(wx.EVT_TIMER, self.on_timer)
        self.timer.Start(100)
        
        panel.Fit()
        self.Fit()
        self.SetSizeHintsSz(self.GetSize())
    
    
    def on_timer(self, event):
        self.anzeige.SetLabel(time.strftime("%H:%M:%S"))
        self.anzeige.Refresh()


def main():
    """Testing"""
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
Das musst du dir nur noch in einen Countdown umbasteln.

mfg
Gerold
:-)

EDIT:

Code: Alles auswählen

        self.anzeige.SetLabel(time.strftime("%H:%m:%S"))
durch

Code: Alles auswählen

        self.anzeige.SetLabel(time.strftime("%H:%M:%S"))
getauscht.
Zuletzt geändert von gerold am Freitag 18. Januar 2008, 14:01, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Danke gerold, ich schraub schon seit gestern dran rum, aber etwas macht mich stutzig.

Wenn ich dein Beispiel starte ist die uhrzeit eine vollkommen andere.
So ungefähr 50 Minuten geht das Programm nach, sowohl unter Vista, als auch Windows 2000, unter Linux (Ubuntu) hab ichs noch nicht getestet.

Bezüglich des Countdown Timers, ich will es so machen das man entweder die Dauer oder aber eine Uhrzeit angeben kann. Ich bastel bislang an der GUI damit es auch was her macht.

Die Berechnung ist soweit klar, aber hab ichs immer noch so ganz gecheckt wie das funktionieren soll.

Ich geh davon aus, das ich jede sekunde ETA = (n - 1) in einer Schleife laufen lassen muss, aber das is nur die Spitze des Eisbergs ~.~

Ist es eigentlich auch möglich Millisekunden sich anzeigen zu lassen oder brauch man dafür Threads !? :oops:

Kann man es eigentlich auch unterdrücken das man nicht dauernd die Konsole sieht wenn man ein python programm startet?!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo skypa!
skypa hat geschrieben:Wenn ich dein Beispiel starte ist die uhrzeit eine vollkommen andere. So ungefähr 50 Minuten
Ich habe mich vertan. In Zeile 33 sollte ein großes "M" statt dem kleinen "m" als Ausgabeformat verwendet werden. :roll:

skypa hat geschrieben:Die Berechnung ist soweit klar, aber hab ichs immer noch so ganz gecheckt wie das funktionieren soll.
Ich versuche mal ein kleines Beispiel zusammenzuhacken.

skypa hat geschrieben:Kann man es eigentlich auch unterdrücken das man nicht dauernd die Konsole sieht wenn man ein python programm startet?!
Natürlich. Starte dein Programm statt mit "Python.exe" mit "Pythonw.exe".

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Abgefahren, ich fragte mich immer wofür die pythonw.exe wohl sein soll... nu weiß ich bescheid :wink:
Sieht gleich viel angenehmer aus, wenn sich nur das öffnet was man auch haben will.

Das mit dem großem M ist mir gestern abend gar nicht mehr aufgefallen, lag wohl am Rotwein.
In meinem Buch stands aber auch nicht drin, welches ich verzweifelt am wälzen war.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

wxPython-Beispiel für eine Stoppuhr, eine Uhr und einen Countdown:
http://paste.pocoo.org/show/22108/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Ker, Respekt Gerold :D

Granatenstark, die Millisekunden flitzen zwar nicht so schnell wie man´s
eigentlich kennt von einer digitalen Stoppuhr, aber egal.

Bis ich darauf gekommen wäre.. pfff... wochen später bestimmt :roll:

Ich poste später mal meine Variante :twisted:
Wie machst du das eigentlich immer? Irgendwie schau ich nicht in den Referenzen wie andere :?

MfG skypa
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skypa hat geschrieben:Wie machst du das eigentlich immer?
Hallo skypa!

Ich verwende WingIDE. Das hat eine richtig gute Codevervollständigung. Deshalb muss ich nicht jedes Attribut eines Objektes auswendig kennen. Und die Docstrings der Attribute werden ebenfalls automatisch angezeigt. Und ich lese alles was ich über Python oder wxPython finden kann. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Danke für den Tipp, werd ich mir auch mal zulegen.
Zu meiner Schande mach ich das *noch* immer mitn Editor :D
Bzw mit Vim unter Linux... man kann sich eben auch selbst das Bein stellen.

Ich bin im Besitz von 6 Ebooks einschließlich "wxPython in Action", allesamt in Englisch, das übt zum einen, aber das was man dann daraus essentiell entnehmen kann ist oft nicht das was ich grad bräuchte.

Aber zum Glück gibts ja dies herrliche Forum mit Gleichgesinnten :wink:

Mfg skypa
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

skypa hat geschrieben:Zu meiner Schande mach ich das *noch* immer mitn Editor :D
Bzw mit Vim unter Linux... man kann sich eben auch selbst das Bein stellen.
Wie meinen? Die produktivsten Programmierer, die ich kenne nutzen Vim oder Emacs. Ich glaube die würden sich wundern wenn du ihnen sagen würdest dass sie sich das Bein stellen.

Naja, wenn ich vom Vim wechseln sollte, dann höchstens zu Emacs :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Der Trick ist einfach beim mit $EDITOR sich selber ein Bein stellen, in die richtige Richtung zu stolpern. Wenn man immer in die richtige Richtung fällt, ist man schneller am Ziel, als Leute, die mit einer IDE gemütlich in diese Richtung gehen. ;-)
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Interessantes Thema, ich bin auch der Meinung das es vorallem mehr in Fleisch und Blut übergeht wenn man Vim oder gar Emacs nutzt, Emacs is für mein Geschmack das heftigste... Spiel grad in WingIDE rum, die Mischung aus beiden is glaub ich genau das richtige für mich.

Mein Kollege ist wahrlich ein Crack in Sachen C++ und PHP, er gehört auch zu denen die auf Emacs bzw Vim schwören :)


MfG skypa
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Ic brauch eure, ich komm nicht drauf.
Na etlichen lesens überb das ganze BoxSizers Zeugs hab ich mich entschlossen es dabei zu belassen.
Die Ausrichtung lässt noch zu wünschen übrig, aber erstmal die Funktion ist wichtig:

Code ausgelagert: http://paste.pocoo.org/show/22984/

Wenn der Wert übergeben wird streikt es.
Jemand ne Idee?

Später soll noch eine Anbindung rein, welche Winamp startet falls das noch nicht geschehen ist, quasi als Wecker mit anständiger Mucke :D

Edit by Gerold: Code ausgelagert
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo skypa!

Es scheitert ja schon an Zeile 76: ``diff_sec = int()``. Das macht keinen Sinn.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Ahhh, ich rast aus. Ja hast recht, das wollt ich noch entfernt haben.
Nur versteh ich eben halt nicht, warum er nörgelt wenn ich erst GetValue() mache und danach split(':')...

Ich probiers weiter...

MfG skypa
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

skypa hat geschrieben:Nur versteh ich eben halt nicht, warum er nörgelt wenn ich erst GetValue() mache und danach split(':')...
Definiere 'nörgelt'. :?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Mit nörgelt mein ich, dass es zu einer Fehlermeldung kommt.

http://paste.pocoo.org/show/22992/

Die Umrechnung funktioniert nicht so wie Sie soll...
Hab mein Fehler erkannt den ich zuvor hatte mit dem array,
die Fehlermeldung lautet nun:

type for timedelta seconds component: unicode
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skypa hat geschrieben:type for timedelta seconds component: unicode
Hallo skypa!

Jetzt hast du hier schon über 60 Beiträge in diesem Board geschrieben. Und trotzdem zeigst du uns immer noch nicht die volle Fehlermeldung. :roll:

Ich rate dir **dringend** einen Debugger einzusetzen. Ich laden den Code in mein WingIDE. Dann führe ich das Programm aus. Sobald ein Fehler passiert, bleibt WingIDE genau in der Zeile stehen, in der der Fehler passiert ist. Dann sehe ich die Fehlermeldung: "TypeError: unsupported type for timedelta seconds component: unicode"

Sofort sieht man, dass hier versucht wird, ein ``datetime.timedelat``-Objekt zu erstellen. Ein solches Objekt kann nicht mit einem Unicode-Objekt erstellt werden. Es braucht für den Parameter ``seconds`` ein Integer-Objekt. Also gebe ich im Debug-Test-Fenster "diff_seconds" ein um zu überprüfen, was da in der Zeile 88 denn so als Parameter übergeben wird.

Das Ergebnis sieht so aus:

Code: Alles auswählen

>>> diff_seconds
u'180000'
>>> 
Ahh! Also ein Unicode-Objekt und dann noch falsch zusammengesetzt. Jetzt weiß ich was zu tun ist.

In Zeile 85 wird mit ``diff_seconds = hours+minutes+secondes`` ein Unicode-String zusammengesetzt. Das kann natürlich nicht funktionieren...


Das war eine kleine Anleitung zum Debuggen von Programmen. ;-) Und ja ich weiß: $179.00 für WingIDE sind recht viel. Aber bei mir hat sich diese Ausgabe schon tausendfach rentiert.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Ohne jetzt näher in den Code geschaut zu haben: `timedelta` arbeitet mit Zahlen, hat lauf Fehlermeldung aber anscheinend etwas vom Typ `unicode` bekommen. Das sollte eigentlich recht deutlich sein.
Antworten