Countdown Tage?

Fragen zu Tkinter.
Antworten
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

hallo
hatte ein jahr python in der schule und das is auch noch lang her^^
das vorne weg^^

so meine frage:
ich will ein programm programmieren, dass mir sagt, wie viele tage es noch bis zu einem bestimmten zeitpunkt sind. also zB für einen geburtstag oder ähnliches! das programm soll mir, wenn ich es öffne, also genau sagen wie viele tage es noch bis zu nem bestimmten datum sind.

wie kann ich so etwas machen?

mfg
skunkk
Humor ist, wenn man trotzdem lacht!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skunkk90 hat geschrieben:wie viele tage es noch bis zu einem bestimmten zeitpunkt sind. also zB für einen geburtstag oder ähnliches!
Hi skunkk!

Mit dem ``datetime``-Modul kannst du so etwas machen:

Code: Alles auswählen

>>> import datetime
>>> dest_date = datetime.date(2007, 1, 1)
>>> today = datetime.date.today()
>>> diff = dest_date - today
>>> diff.days
70
>>>
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

hey cool danke! :D

nur ein problem: wie mach ich die diff.days zu nem str?
dieser fehler kommt nämlich wenn ich das in nem ScrolledText ausgeben will:
(ausgabefeld.insert(END,diff.days)
AttributeError: 'str' object has no attribute 'days'




dann habe da aber noch eine frage^^

und zwar, wie kann ich machen, dass die einstellungen für das programm geändert werden können vom benutzer?

also wenn ich das programm starte, zählt es wie programmiert einen bestimmten countdown, dieser kann dann dann jedoch von user verändert werden. und wenn das passiert, zählt das programm am nächsten programm den neuen countdown...

weisste was ich mein?
also muss da quasi noch en save oder so rein, just how?
Humor ist, wenn man trotzdem lacht!
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Bitte schön:

ausgabefeld.insert(END,str(diff.days))

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

skunkk90 hat geschrieben:(ausgabefeld.insert(END,diff.days)
Hi skunkk!

Mach das nicht -- verwende die neue Syntax, wenn du mit WX programmierst. Importiere wx so:

Code: Alles auswählen

import wx
und nicht so:

Code: Alles auswählen

from wx import *
Dann kannst du auf die Konstante ``END`` so zugreifen:

Code: Alles auswählen

wx.END
Auch wenn du es nicht glaubst. Aber das macht deinen Code viel lesbarer.

Siehe: http://wiki.wxpython.org/index.cgi/wxPython_Style_Guide

Das ist eine gute Anleitung für den Beginn mit wxPython. -- Auch wenn teilweise noch IDs für Menüeinträge verwendet werden.

http://wiki.wxpython.org/index.cgi/AnotherTutorial

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skunkk90 hat geschrieben:(ausgabefeld.insert(END,diff.days)
AttributeError: 'str' object has no attribute 'days'
Hi skunkk!

Kann es sein, dass du ``diff`` mit einem String überschrieben hast, so dass es kein Objekt vom Typ ``timedelta`` mehr ist?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

also des mit dem fehler hat sich bisher ergeben.
hatte da ein kleines durcheinander..

bisher sieht mein script so aus:

Code: Alles auswählen

from Tkinter import*
from ScrolledText import*
import datetime

hf=Tk()
frame1=Frame(hf,width=250,height=250)
frame1.pack()
hf.title("Countdown")
hf.iconbitmap('favicon.ico')

dest_date=datetime.date(2006,11,30)
today=datetime.date.today()
diff=dest_date-today

def close():
    hf.destroy()

def berechne():
    jahr=jahr1.get()
    monat=monat1.get()
    tag=tag1.get()
    dest_date=datetime.date(jahr,monat,tag)
    today=datetime.date.today()
    diff=dest_date-today
    ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ") 
    ausgabefeld.insert(END, str(diff.days) +" Tage!")

ausgabefeld=ScrolledText(frame1,width=36,height=8)
ausgabefeld.place(x=5,y=5)
closebutton=Button(frame1,text="Beenden",command=close,width=20)
closebutton.place(x=5,y=220)
ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ")
ausgabefeld.insert(END, str(diff.days) +" Tage!")
label1=Label(frame1,text="Countdown Einstellungen:\n(  Jahr / Monat / Tag  )")
label1.place(x=4,y=120)
jahr1=Entry(frame1, width=5)
jahr1.place(x=5,y=160)
monat1=Entry(frame1, width=5)
monat1.place(x=50,y=160)
tag1=Entry(frame1, width=5)
tag1.place(x=94,y=160)
berechne=Button(frame1,text="Berechne!",width=20,command=berechne)
berechne.place(x=5,y=190)



hf.mainloop()
so weit so gut, nur wenn der benutzer jetzt ein neuen countdown eingeben will funzt es nicht mit der berechnung
siehe:

Code: Alles auswählen

def berechne():
    jahr=jahr1.get()
    monat=monat1.get()
    tag=tag1.get()
    dest_date=datetime.date(jahr,monat,tag)
    today=datetime.date.today()
    diff=dest_date-today
    ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ") 
    ausgabefeld.insert(END, str(diff.days) +" Tage!")
es geht nicht wegen der variablen

Code: Alles auswählen

dest_date=datetime.date(jahr,monat,tag)
wie kann ich machen, dass er für die variablen hier die jeweiligen zahlen eingibt?

dann wäre da noch dieses save problem, so wie der script jetzt ist, soll er ja nciht bleiben, er soll nach eingabe des neuen countdown, den alten ersetzen und nach beenden des programms und wieder öffnen den neuen benutzen. das ist demnach auch meine nächste frage, wie geht das?




und jetzt mal was ganz anderes...
diese tutorials, gibt es die nicht i-wo in deutsch? die machen mich ganz kirre und das is net gut, da komm ich nur noch mehr durcheinander...
hatte python 1 jahr lang in der schule, da hatten wir gepythoned (^^) bis zu while-schleifen in Tkinters, also nicht auf eurem niveau hier... des bereue ich, aber die tutorials in englisch helfen mir nicht wirklich, weil ich es nicht verstehe...

puh^^ :D
Humor ist, wenn man trotzdem lacht!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Ich habe das Thema nach Tkinter verschoben... :?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

skunkk90 hat geschrieben:aber die tutorials in englisch helfen mir nicht wirklich, weil ich es nicht verstehe...
Hi skunkk!

Es gibt auch ein paar deutsche Bücher zu Python:

- Pyton for Kids (ist aber auch für Erwachsene geeignet)
- Python Ge-Packt
- Objektorientierte-Programmierung mit Python

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

danke für den tipp.


aber jetzt nochmal zu meiner frage (ich weiss ich hatte mehr als eine :D ,aber ich mein die hier:)

dest_date=datetime.date(jahr,monat,tag)

jahr, monat und tag sind variablen,
so wie es auch oben im script steht, ergibt es nur fehler.
wie kann ich es ansonsten machen, dass die tage über ein eingegebenes datum erechnet werden?
Humor ist, wenn man trotzdem lacht!
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Code: Alles auswählen

def berechne():
    jahr=jahr1.get()
    monat=monat1.get()
    tag=tag1.get()
    dest_date=datetime.date(int(jahr),int(monat),int(tag))
    today=datetime.date.today()
    diff=dest_date-today
    ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ")
    ausgabefeld.insert(END, str(diff.days) +" Tage!")
So läufts! Die Fehlermeldung sagte es schon. Aus deinen Entrys
werden Strings ausgelesen und diese solltest du durch int()
in Integer konvertieren lassen.

Gruß,
M.
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Hab den Code mal ein wenig umgebaut und die laden/speichern Sache gemacht. War nicht wirklich schwierig und mal ganz am Rande:

Gute Python Tutorials sind sehr wohl auch auf deutsch zu haben!

Alles eine Frage des Einsatzes...:wink:

Code: Alles auswählen

from Tkinter import*
from ScrolledText import*
import datetime
import string

def close():
    hf.destroy()

def berechne():
    j = int(jahr1.get())
    m = int(monat1.get())
    t = int(tag1.get())
    dest_date = datetime.date(j,m,t)    
    diff = dest_date - datetime.date.today()
    ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ")
    ausgabefeld.insert(END, str(diff.days) +" Tage!\n")
    datei = open("time_date.txt","w+")    
    datei.writelines(str(j) + "." + str(m) + "." + str(t))  #Datum schreiben
    datei.close()   

hf=Tk()
frame1=Frame(hf,width=250,height=250)
frame1.pack()
hf.title("Countdown")
datei = open("time_date.txt","r") 
zeile = datei.readline()            #Datum lesen
datei.close()
temp_list = string.split(zeile,".")
jahr, monat, tag = int(temp_list[0]), int(temp_list[1]), int(temp_list[2])
dest_date = datetime.date(jahr,monat,tag)
diff = dest_date - datetime.date.today()
ausgabefeld = ScrolledText(frame1,width=36,height=8)
ausgabefeld.place(x=5,y=5)
closebutton = Button(frame1,text="Beenden",command=close,width=20)
closebutton.place(x=5,y=220)
ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" (Jahr,Monat,Tag)\nsind es noch ")
ausgabefeld.insert(END, str(diff.days) +" Tage!\n")
label1 = Label(frame1,text="Countdown Einstellungen:\n(  Jahr / Monat / Tag  )")
label1.place(x=4,y=120)
jahr1 = Entry(frame1, width=5)
jahr1.place(x=5,y=160)
monat1 = Entry(frame1, width=5)
monat1.place(x=50,y=160)
tag1 = Entry(frame1, width=5)
tag1.place(x=94,y=160)
berechne = Button(frame1,text="Berechne!",width=20,command=berechne)
berechne.place(x=5,y=190)
hf.mainloop()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ah, ok. Jetzt noch aus from Tkinter import * ein import Tkinter as tk machen, die Variablennamen anpassen (so wie Gerold weiter oben, nur mit wxPython geschrieben hat) und dann noch den ganzen Kram in Funktionen packen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

Code: Alles auswählen

from Tkinter import*
from ScrolledText import*
import datetime
import string

hf=Tk()
frame1=Frame(hf,width=250,height=250)
frame1.pack()
hf.title("Countdown")
hf.iconbitmap('favicon.ico')

def close():
    hf.destroy()

def berechne():
    jahr=jahr1.get()
    monat=monat1.get()
    tag=tag1.get()
    dest_date=datetime.date(int(jahr),int(monat),int(tag))
    today=datetime.date.today()
    diff=dest_date-today
    ausgabefeld.insert(END,"Bis zum "+ str(tag) + "." + str(monat) + "." + str(jahr) +" sind\nes noch ") 
    ausgabefeld.insert(END, str(diff.days) +" Tage!\n\n")
    s=(str(tag) + "." + str(monat) + "." + str(jahr))
    datei=file("cdn.dat","w")
    datei.write(s)
    datei.close()

ausgabefeld=ScrolledText(frame1,width=36,height=8)
ausgabefeld.place(x=5,y=5)
closebutton=Button(frame1,text="Beenden",command=close,width=20)
closebutton.place(x=5,y=220)
#
datei=file("cdn.dat","r")
zeile=datei.readlines()
datei.close()
temp_list = string.split(zeile,".")
jahr, monat, tag = int(temp_list[0]), int(temp_list[1]), int(temp_list[2])
dest_date = datetime.date(tag,monat,jahr)
diff = dest_date - datetime.date.today()
#
ausgabefeld.insert(END,"Bis zum "+ str(dest_date) +" sind\nes noch ")
ausgabefeld.insert(END, str(diff.days) +" Tage!\n\n")
label1=Label(frame1,text="Countdown Einstellungen:\n(  Tag / Monat / Jahr  )")
label1.place(x=4,y=120)
jahr1=Entry(frame1, width=5)
jahr1.place(x=94,y=160)
monat1=Entry(frame1, width=5)
monat1.place(x=50,y=160)
tag1=Entry(frame1, width=5)
tag1.place(x=5,y=160)
berechne=Button(frame1,text="Berechne!",width=20,command=berechne)
berechne.place(x=5,y=190)

hf.mainloop()
Fehler:
temp_list = string.split(zeile,".")
File "D:\Programmieren\Python\lib\string.py", line 290, in split
return s.split(sep, maxsplit)
AttributeError: 'list' object has no attribute 'split'
Humor ist, wenn man trotzdem lacht!
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

Leonidas hat geschrieben:Ah, ok. Jetzt noch aus from Tkinter import * ein import Tkinter as tk machen, die Variablennamen anpassen (so wie Gerold weiter oben, nur mit wxPython geschrieben hat) und dann noch den ganzen Kram in Funktionen packen.
das mit dem "from Tkinter import*" und "import Tkinter as Tk" kapier ich immernoch net, ich seh den unterschied net, habe es damals so beigebracht bekommen...
vllt kann das ja einer auf deutsch ma sagen :D
Humor ist, wenn man trotzdem lacht!
MBR
User
Beiträge: 29
Registriert: Freitag 29. September 2006, 17:03

Kann es sein, dass du bei Ausführung des Scripts noch keine Textdatei ertstellt hast?

den Namen hast du ja bereits in cdn.txt geändert. Der Inhalt sollte folgendermassen aussehen :

2006.11.30 (ohne Zeilenumbruch!)

Dann sollte alles laufen!

Seh´s gerade, in Zeile 35 aus dem Readlines bitte ein Readline machen. das wärs dann.
Benutzeravatar
skunkk90
User
Beiträge: 57
Registriert: Donnerstag 1. Juni 2006, 20:38
Wohnort: F:\Homeverzeichnis.zip
Kontaktdaten:

also die datei war vorhanden, der fehler war wirklich dieses readline!
vielen dank es funzt!
Humor ist, wenn man trotzdem lacht!
Antworten