zeit different

Fragen zu Tkinter.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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

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)
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,
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)
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
Zuletzt geändert von Anonymous am Freitag 3. Juni 2016, 14:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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()
BlackJack

@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.
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

hallo BlackJack, ich hoffe das ich es jetzt verstanden habe, erst nach der Berechnung in string umwandeln, oder erst dann wenn die Label gefüllt werden.
Vielen Dank
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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.

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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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:

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))
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

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

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')

Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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'
ganja
User
Beiträge: 189
Registriert: Mittwoch 3. Dezember 2014, 07:44

Hallo,

@Sirius3 vielen Dank, @BlackJack dir auch vielen Dank.

Gruß
ganja
Antworten