@ganja: Deine StopWatch-Klasse macht hier meiner Meinung nach zu viel. Das Sammeln von Ergebnissen wäre besser in Deiner GUI-Klasse aufgehoben, und dann dort in einer Liste, statt in einer Datei. Was Du da genau mit ergebnis und erg machst ist mir auch unklar. Jedenfalls sollten das keine Attribute sein. Das zeigt sich auch daran, dass Du versuchst in write_list auf self.erg zuzugreifen und es danach löschst. Dateien die mit "w" geöffnet werden, werden neu erstellt, der alte Inhalt also gelöscht. "a" hängt dagegen ans Ende der Datei an. Was bezweckst Du mit der Zeile "f.closed"?
In get_erg ist liste keine Liste und sollte auch kein Attribut sein. Wenn ich die letzten 10 Ergebnisse darstellen wollte, würde ich die Labels einmal erzeugen und alle 2 Sekunden nur den Inhalt ändern, statt sie jedesmal neu zu erzeugen.
zeit different
Hallo Sirius3,
Vielen Dank, für die Tipps ich habe es fast geschafft, habe noch ein kleines Problem ich bekomme nicht die 10 Ergebnis die am nächstem der vorgabe sind z.b. 10 sec. Die Datei ist im Moment leichter für mich wie eine liste um zusetzen da mir noch Erfahrung fehlt. ich probiere teste und wenn es geht und ich verstehe was ich tue dann ist ok fürs erste. Vielen Dank für den Tipp mit 'a'. Wenn ich es alle 2 sec mit after Update dann habe ich in dem frame1 kurze Aussetzer, deshalb habe ich gedacht wenn stopp dann Update, so habe ich es auch im Moment am laufen.
hier ein bsp. so sieht meine Datei aus:
0:00:02.30
0:00:04.40
0:00:00.50
0:00:04.40
0:00:04.21
0:00:03.95
0:00:04.45
0:00:04.10
0:00:04.15
0:00:03.10
0:00:04.56
0:00:03.05
0:00:03.39
0:00:02.87
0:00:04.14
0:00:04.27
usw
Vielen Dank, für die Tipps ich habe es fast geschafft, habe noch ein kleines Problem ich bekomme nicht die 10 Ergebnis die am nächstem der vorgabe sind z.b. 10 sec. Die Datei ist im Moment leichter für mich wie eine liste um zusetzen da mir noch Erfahrung fehlt. ich probiere teste und wenn es geht und ich verstehe was ich tue dann ist ok fürs erste. Vielen Dank für den Tipp mit 'a'. Wenn ich es alle 2 sec mit after Update dann habe ich in dem frame1 kurze Aussetzer, deshalb habe ich gedacht wenn stopp dann Update, so habe ich es auch im Moment am laufen.
hier ein bsp. so sieht meine Datei aus:
0:00:02.30
0:00:04.40
0:00:00.50
0:00:04.40
0:00:04.21
0:00:03.95
0:00:04.45
0:00:04.10
0:00:04.15
0:00:03.10
0:00:04.56
0:00:03.05
0:00:03.39
0:00:02.87
0:00:04.14
0:00:04.27
usw
Code: Alles auswählen
class Stopwatch(object):
def stop(self):
#das sieht nicht gut aus es geht wahrscheinlich besser, das self.erg liefert mir 6 zeichen hinter punkt, ich möchte 2 und dann habe ich versucht probiert, es tut aber wenn man die vorgabe überschreitet bekomme ich -1 tag .... zurück, das muss ich noch ändern
self.elapsed_time = DateTime.utcnow() - self.start_time
self.start_time = None
rounden = TimeDelta(0,0,010000)
self.ergebnis = TimeDelta(0,10,0)
self.erg = self.ergebnis - self.elapsed_time
self.erg = self.erg + rounden
#print ('nach rou' ,self.erg)
self.erg = str(self.erg)
self.erg = self.erg[:10]
#print('zum ersten ',self.erg)
self.write_list()
def write_list(self):
if self.erg:
with open('ergebnise.txt', 'a') as f:
f.write(self.erg + "\n")
class StopwatchUI(tk.Frame):
def get_erg(self):
self.liste = ''
with open('/home/ja/Downloads/sa_stika/python/vom_raspi/zeiterfassung/ergebnise.txt', 'r') as f:
for line in f:
self.liste = line
print('1111111111', self.liste)
return (self.liste)
def update_erg(self):
#print ('22222' , self.liste)
erg = ''
for widget in self.get_erg_widgets:
widget.destroy()
self.get_erg_widgets = list()
for erg in self.get_erg():
for column, text in enumerate([erg]):
view = sorted(erg)
#print ('tztuztutuztuztuztuzttuz',view)
for text in view:
#print('koliko ', self.liste)
label = tk.Label(self.frame1, text=self.liste, justify=tk.LEFT, font="bold", bg='#AAC4D3',width=50)
label.pack()
self.get_erg_widgets.append(label)
Hallo,
hier mit bekomme ich die ausgabe,
leider um so größer die datei wird um so langsamer wird meine gui und wenn ich die vorgegeben zeit überschreite bekomme ich
'-1 day, 23' als Ergebnis zurück. Habt ihr ein Tipp für mich wie löse ich die 2 Probleme damit wir anfangen können zu spielen.
Danke im Voraus
hier mit bekomme ich die ausgabe,
Code: Alles auswählen
def update_erg(self):
#print ('22222' , self.liste)
erg = ''
for widget in self.get_erg_widgets:
widget.destroy()
self.get_erg_widgets = list()
for row_number,(erg) in enumerate(self.get_erg()):
#for column_number , text in enumerate([erg]):
view = sorted(self.liste)
#print ('1111111111111111111111111111111111 ',view)
for text in view[0:10]:
#print('koliko ', self.liste)
label = tk.Label(self.frame2, text=text, justify=tk.LEFT, font="bold", bg='white',width=50)
label.pack()
self.get_erg_widgets.append(label)
#self.frame1.after(2000, self.update_erg)
'-1 day, 23' als Ergebnis zurück. Habt ihr ein Tipp für mich wie löse ich die 2 Probleme damit wir anfangen können zu spielen.
Danke im Voraus
Zuletzt geändert von Anonymous am Freitag 3. Juni 2016, 14:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@ganja: warum hast Du da zwei verschachtelte for-Schleifen? Was ist self.liste und warum wird die mehrfach sortiert? Wie ich schon vor zwei Wochen geschrieben habe, solltest Du am besten Deine TimeDelta selbst in einen String verwandeln, dann kannst Du negative Zeiten auch so darstellen, wie Du es möchtest.
Hallo Sirius3, die verschachtelte for schleife hatte ich übersehen, habe es jetzt geändert, versuche deinen Tipp zu befolgen aber ich scheitere, ich glaube die Berechnung mache ich total falsch, es muss einen einfacheren weg geben, aber mir fällt nichts anders im Moment ein. kann es sein das in den strings einmal : und deswegen es nicht geht, nur damit ich es verstehe.
Code: Alles auswählen
def stop(self):
self.elapsed_time = DateTime.utcnow() - self.start_time
self.start_time = None
self.elapsed_time = str(self.elapsed_time) #test
self.elapsed_time = self.elapsed_time[2:10] #test
print('self.elapsed_time',self.elapsed_time)
rounden = TimeDelta(0,0,010000)
self.ergebnis = TimeDelta(0,5,0)
print('self.ergebnis',self.ergebnis)
self.erg = self.ergebnis - self.elapsed_time
# hier scheitere ich, TypeError: unsupported operand type(s) for -: 'datetime.timedelta' and 'str', ist auch irgend wie logisch, wenn ich aber string - string mache geht es auch nicht, TypeError: unsupported operand type(s) for -: 'str' and 'str'
##self.erg = self.erg + rounden
##self.erg = str(self.erg)
##self.erg = self.erg[:10]
##print('zum ersten ',self.erg)
#print('stop',self.elapsed_time)
#vorgabe = TimeDelta(0,5,0)
#self.erg = vorgabe - self.elapsed_time
#print('ttttttttt ',self.erg)
##self.write_list()
@ganja: Was sollte denn dabei heraus kommen wenn man zwei Zeichenketten voneinander abzieht? Es müssen natürlich Zeitobjekte sein, denn die wissen wie sie voneinander subtrahiert werden.
Hallo,
Bitte nicht Lachen, ich bekomme es nicht hin, wenn man die Vorgabe überschreitet, ich weiß das ihr Profis seid und das ihr das im kleinen Finger habt, im Moment bin ich am verzweifeln ich sehe von lauter Bäume den Wald nicht, und wenn ich es mir jetzt so anschaue was ich da mache das ist so kompliziert für mich geworden, vielleicht habt ihr kurz zeit und Lust mir zu Helfen.
Bitte nicht Lachen, ich bekomme es nicht hin, wenn man die Vorgabe überschreitet, ich weiß das ihr Profis seid und das ihr das im kleinen Finger habt, im Moment bin ich am verzweifeln ich sehe von lauter Bäume den Wald nicht, und wenn ich es mir jetzt so anschaue was ich da mache das ist so kompliziert für mich geworden, vielleicht habt ihr kurz zeit und Lust mir zu Helfen.
Code: Alles auswählen
def stop(self):
self.elapsed_time = DateTime.utcnow() - self.start_time
self.start_time = None
rounden = TimeDelta(0,0,010000)
self.ergebnis = TimeDelta(0,5,0)
self.erg = self.ergebnis - self.elapsed_time
print('self.erg',self.erg)
self.erg = self.erg + rounden
#print ('nach rou' ,self.erg)
self.erg = str(self.erg)
#self.erg = self.erg[8:22]
print('2222333 self.erg',self.erg)
if self.erg[0] == '0':
self.erg = self.erg[:10]
self.erg = self.erg + ' zu schnell'
print('00000zum ersten ',self.erg)
#hier ist oben ist alles ok, wenn man unter der vorgabe ist wird halt die fehlende zeit angezeigt und dazu noch 'zu schnell'
#hier unten fangen meine probleme an, wenn man die zeit überschritten hat bekomme ich zurück '-1 day, 23:59:56.960928' dann schaue ich wenn '-' dann mache ich ein string nur mit der zeit z.b '23:59:55.87', ich denke ich muß jetzt den string wieder in etwas umwandeln womit ich rechnen kann, ich dachte 24:00:00.00 - 23:59:56.96 (bestimmt gibt es einfachere Berechnung, die kenne ich aber nicht, und zu wenig Erfahrung und kenntnis) dann habe ich mein ergebnis, dabei scheitere ich im Augenblick.
if self.erg[0] == '-':
#self.erg = self.erg[8:19]
#self.erg = TimeDelta(self.erg)
print(' selferg nach', self.erg)
self.erg = vorgabe2 - self.erg
self.erg = self.erg + ' zu schnell'
self.write_list()
Zuletzt geändert von Anonymous am Sonntag 5. Juni 2016, 16:45, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@ganja: das was Du hier in die `stop`-Methode schreibst gehört da nicht hin, weil es nichts mit dem stoppen einer Stopuhr zu tun hat.
Generell sieht kann man Dein Problem so lösen:
Generell sieht kann man Dein Problem so lösen:
Code: Alles auswählen
TARGET_TIME = TimeDelta(seconds=5)
NULL_DELTA = TimeDelta(0)
EPS_DELTA = TimeDelta(seconds=0.01)
[...]
difference = stopwatch.elapsed_time - TARGET_TIME
if abs(difference) < EPS_DELTA:
print("Getroffen!")
elif difference < NULL_DELTA:
print("Zu langsam um {}".format(abs(difference))
else:
print("Zu schnell um {}".format(abs(difference))
hallo Sirius3, Vielen Dank, ich dachte mir schon das es viel einfacher gehen muss als ich das versucht habe(du hast 10 zeilen code und ich habe 20, danke das du deine Erfahrung und dein wissen teilst), ich habe es in stop() drin da ich dachte das es an dieser stelle richtig ist, ich weiss leider nicht wo der richtige platz dafür wäre als stop da ich das Ergebnis in die Datei speichern will.
Vielen Dank, ich probiere mal
Vielen Dank, ich probiere mal
Hallo miteinander, ich würde gerne mein spiel noch ein wenig aufpeppen, wenn man in einem bestimmtem bereich ist sollte der hintergrund zb. blau sein wenn nicht dann gelb, und ganz am Anfang sollte das label weiß sein, ich habe mir eine if abfrage gebastelt die auch mit print() gut funktioniert, jetzt weiß ich nicht muss ich das dem label zuweisen oder dem frame indem das label ist, egal was ich versucht habe habe leider kein Erfolg gehabt, vielleicht hat noch jemand kurz zeit und lust mir nochmal zu helfen und dann sollte es mit dem spiel sein dann sollte es fertig sein. Hier noch mal code vom label und meiner if bastelei.
die if abfrage habe ich in def update_display() mit drin, ich denke da ist es an der falschen stelle, aber da ich mich nicht gut auskenne bin ich mir nicht sicher
die if abfrage habe ich in def update_display() mit drin, ich denke da ist es an der falschen stelle, aber da ich mich nicht gut auskenne bin ich mir nicht sicher
Code: Alles auswählen
[code]
self.display = tk.Label(parent, font=("Helvetica Bold", 121),background='white')
self.display.pack(side=tk.TOP)
if self.stopwatch.elapsed_time:
print ('stalice biti ovde 000000000000 ', self.stopwatch.erg)
#self.label = tk.Label(parent, text = text, font=("Helvetica Bold", 121),background='white')
elif TARGET_TIME <= self.stopwatch.elapsed_time <= TARGET_TIME1:
print ('stalice biti ovde 111111111 ', self.stopwatch.erg)
#self.label = tk.Label(parent, text = text, font=("Helvetica Bold", 121),background='blue')
else:
print ('stalice biti ovde 222222222 ', self.stopwatch.erg)
#self.label = tk.Label(parent, text = text, font=("Helvetica Bold", 121),background='yellow')
@ganja: update_display ist schon die richtige Methode, weil Du ja neben der Zeit auch die Farbe erneuern willst. Nur solltest Du nicht immer neue Label-Objekte generieren, sondern das vorhandene einfach ändern:
Code: Alles auswählen
self.display['background'] = 'red'