zeit different

Fragen zu Tkinter.
BlackJack

Mittwoch 11. Mai 2016, 21:52

@ganja: Das ist ziemlich eindeutig Python 3 für das Hy installiert ist.

Die beiden Vorkommen von Tkinter am Anfang in tkinter umbenennen reicht aus um das mit Hy für Python 3 auszuführen.
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Donnerstag 12. Mai 2016, 07:12

Guten Morgen,

@BlackJack Vielen Dank für den tip mit umbenennen läuft ist echt cool das es so etwas gibt.
Ich habe leider nicht jeden tag zeit um zu Programmieren, ich habe alle paar Monate 2-3 Tage dafür zeit, muß aber jetzt öfter mir die zeit nehmen.

Ich würde gerne für meine Kinder und mich das fertig stellen was ich bis jetzt habe, leider komme ich im moment nicht weiter wie lass ich den timer im Hintergrund laufen wenn start gedrückt wird, es sollen nur 00:00:00 angezeigt werden erst bei stop soll die zeit angezeigt werden zb. 00:04.98. Damit will ich die Kinder einwenig beschäftigen und ärgern :)

Wie du @BlackJack gesagt hast ich sollte objektprogrammiert lernen, ich werde versuchen das was ich bis jetzt habe umzuschreiben, vielleicht könnt ihr mir noch ein tip geben, ich schreibe das alles mit texteditor(kwrite), gibt es vielleicht eine Umgebung die mir einwenig die Arbeit erleichtert?

Danke

Gruß
ganja
Sirius3
User
Beiträge: 8290
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 12. Mai 2016, 09:05

@ganja: Wenn Du nur die Zeitdifferenz am Ende anzeigen willst, brauchst Du selbst ja gar nichts im Hintergrund zu tun, weil die Uhr läuft automatisch mit. Also quasi nur:

Code: Alles auswählen

def start_key(self, event):
    self.start_time = datetime.datetime.now()

def stop_key(self, event):
    time_diff = datetime.datetime.now() - self.start_time
    self.timeText.configure(text=str(time_diff))
BlackJack

Donnerstag 12. Mai 2016, 09:23

Ich hatte in meiner Hy-Stopuhr `utcnow()` verwendet, sonst kann es passieren das die zweimal im Jahr zu bestimmten Zeiten nicht so funktioniert wie man das erwartet. :-D
BlackJack

Donnerstag 12. Mai 2016, 10:51

Mal mit Trennung von Geschäftslogik und GUI:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from datetime import datetime as DateTime, timedelta as TimeDelta


class Stopwatch(object):

    def __init__(self):
        self.start_time = None
        self.elapsed_time = TimeDelta()

    def __str__(self):
        return str(self.elapsed_time)

    @property
    def is_running(self):
        return bool(self.start_time)

    def start(self):
        self.start_time = DateTime.utcnow()
        self.elapsed_time = TimeDelta()

    def stop(self):
        self.elapsed_time = DateTime.utcnow() - self.start_time
        self.start_time = None

    def toggle(self):
        if self.is_running:
            self.stop()
        else:
            self.start()


class StopwatchUI(tk.Frame):

    def __init__(self, parent, stopwatch):
        tk.Frame.__init__(self, parent)
        self.stopwatch = stopwatch
        self.display = tk.Label(self)
        self.display.pack(side=tk.TOP)
        self.toggle_button = tk.Button(self, command=self.do_toggle)
        self.toggle_button.pack(side=tk.TOP)
        self.update_display()

    def update_display(self):
        self.display['text'] = self.stopwatch
        self.toggle_button['text'] = (
            'Stop' if self.stopwatch.is_running else 'Start'
        )

    def do_toggle(self):
        self.stopwatch.toggle()
        self.update_display()


def main():
    root = tk.Tk()
    root.title('Zeit stoppen')
    ui = StopwatchUI(root, Stopwatch())
    ui.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Sonntag 15. Mai 2016, 12:36

Hallo,
dein Beispiel @BlackJack ist perfekt, leicht zu lesen und zu verstehen, ich habe versucht es an meine Bedürfnisse anzupassen, vielleicht habe ich es falsch gemacht

Code: Alles auswählen

def __init__(self):
	self.start_time = None
	#######
	self.elapsed_time = ('0' + str(TimeDelta())) 
	#######
	#hier möchte ich 00:00:00 ausgabe und nicht 0:00:00, ist das der richtige weg um das zu erreichen
	
def stop(self):
	self.elapsed_time = DateTime.utcnow() - self.start_time
	######
	self.elapsed_time = str(self.elapsed_time) #test
	self.elapsed_time = self.elapsed_time[2:10] #test
	######
	#hier auch, ich möchte nur 2 letzte zahlen von den mili oder micro secunden haben, da bin ich mir auch nicht sicher ob das 
	#der richtige weg ist, zumindest macht es genau das was ich will, vielleicht kann man es noch eleganter hin bekommen
	
	self.start_time = None
	#print(self.elapsed_time)
	#print('stop')
	
#hier würde ich gerne um ein reset erweitern 
def reset(self):
	self.elapsed_time = '00:00:00'
	self.start_time = None
	#print('reset')

#hier bekomme ich problem, da immer reset 
def toggle(self):
	if self.is_running:
		self.stop()
	else:
	#elif self.is_running:
		self.start()
	#else:
	#	self.reset()
	
#hier scheitere ich an der erweiterung des reset
def update_display(self):
	self.display['text'] = self.stopwatch
	self.toggle_button['text'] = (
		'Stop' if self.stopwatch.is_running else 'Start'
		###'Stop' if self.stopwatch.is_running elif self.stopwatch.is_running 'Start' else 'Reset'###
		#  not gibt es nicht?
	)

#ich würde gerne button raus nehmen und das ganze an tastatur eingabe (es sollte mit irgend einer taste gehen, zb. taste s 1x gedrückt = start, taste s zum zweiten mal stop, taste s zum dritten mal reset) dran verknüpfen, ist so etwas möglich?

class StopwatchUI(tk.Frame):
	#@staticmethod
	#def s_Key(event):
	#	print (event + " key pressed")

	#@staticmethod
	#def d_Key(event):
	#	print (event + " key pressed")

# bei def main habe ich noch, aber im moment geht es noch nicht 

#root.bind('<s>', s_Key)
#root.bind('<d>', d_Key)
#root.focus_set()
Danke

Gruß
ganja
Zuletzt geändert von Anonymous am Sonntag 15. Mai 2016, 14:20, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 8290
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 15. Mai 2016, 14:28

@ganja: TimeDelta bietet nicht so komfortable Formatierungsmethoden an, wie es z.B. DateTime tut. Das heißt, Du mußt das selbst machen. Aber statt überall elapsed_time in einen String zu konvertieren, bietet es sich an, nur die __str__-Methode von Stopwatch zu ändern:
Z.B. so:

Code: Alles auswählen

    def __str__(self):
        seconds = self.elapsed_time.total_seconds()
        minutes, seconds = divmod(seconds, 60)
        hours, minutes = divmod(minutes, 60)
        return '{0:02.0f}:{1:02.0f}:{2:05.2f}'.format(hours, minutes, seconds)

    def reset(self):
       self.elapsed_time = TimeDelta()
       self.start_time = None
Für einen Three-State-Button brauchst Du auch eine Variable, die 3 Zustände annehmen kann. is_running hat nur zwei:

Code: Alles auswählen

    def update_display(self):
        self.display['text'] = self.stopwatch
        self.toggle_button['text'] = (
            'Stop' if self.stopwatch.is_running else
            'Reset' if self.stopwatch.elapsed_time else 'Start'
        )
 
    def do_toggle(self):
        if self.stopwatch.is_running:
            self.stopwatch.stop()
        elif self.stopwatch.elapsed_time:
            self.stopwatch.reset()
        else:
            self.stopwatch.start()
        self.update_display()
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Montag 16. Mai 2016, 07:40

Hallo @Sirius3, vielen Dank es funktioniert, ist es möglich geht das überhaupt, das ich anstatt Button Tastatur benutze, das ist mein versuch, aber leider ohne Erfolg, irgendetwas übersehe ich im Moment da fehlt noch was, versuche ich heute Nachmittag nochmal.
Noch einmal Vielen Dank @Sirius3

Code: Alles auswählen

def s_Key(self, event):
	self.start_time = DateTime.utcnow()
	print(self.elapsed_time)
		print (event + " key pressed")

def d_Key(self,event):
	self.elapsed_time = DateTime.utcnow() - self.start_time
	self.start_time = None
	print(self.elapsed_time)
	print (event + " key pressed")
	
def r_Key(self,event):
	self.elapsed_time = TimeDelta()
	self.start_time = None
	print (event + " key pressed")
	
##im main habe dann das hinzugefügt
def main():
	root.bind('<s>', s_Key)
	root.bind('<d>', d_Key)
	root.bind('<r>', d_Key)
	root.focus_set()
Sirius3
User
Beiträge: 8290
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 16. Mai 2016, 08:02

@ganja: das geht, wenn Du die Bindings richtig in die StopwatchUI-Klasse integrierst.
BlackJack

Montag 16. Mai 2016, 11:05

Wobei: Wenn der eine Button den es momentan gibt, den Fokus hat, dann kann man den auch ohne irgendwas spezielles zu tun mit der Leertaste ”klicken”. Das ist die Tk-Standardbindung für Schaltflächen.
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Montag 16. Mai 2016, 14:14

Hallo,

Danke @Sirius3, das werde ich dann versuchen, ich möchte das man den Button gar nicht sieht.

Danke @BlackJack, das habe ich nicht gewusst das man auch Leertaste benutzen kann, muss ich auf einem anderem Rechner probieren auf meinem geht es nicht, wenn das mit der Leertaste klappt, kann ich irgendwie den Button unsichtbar machen geht so etwas.

Da wo der Button im Moment ist möchte ich eine liste mit 10 Ergebnisen wer am nächsten dran war, und ich denke ohne Button sieht es besser aus, vielleicht kaufe ich noch irgend einen Drücker, dann soll es mit dem Drücker gehen.

euch zwei nochmal Vielen Dank
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Freitag 20. Mai 2016, 16:02

Hallo,
Ich brauche ein wenig Unterstützung falls jemand Lust/zeit/etc hat.
Mein vorhaben habe ich dank @BlackJack und @Sirius3 fast geschafft, ich kann jetzt mit der taste starten stoppen und Reset ausführen d.h den Button benutzen, Ich möchte jetzt den Button entfernen und nur mit der taste starten stoppen Reset ausführen, dafür müsste ich 'def update_display(self):' anpassen denke ich, daran scheitere ich aber im Moment, das 'def do_toggle(self):' würde ich dann nicht mehr brauchen da das 'def s_Key(self, event):' übernimmt, oder liege ich komplett falsch?

Würde mich wirklich freuen falls jemand zeit hat, und mir einen Tipp oder Beispiel geben könnte.
Danke

Code: Alles auswählen

class StopwatchUI(tk.Frame):

	#self.frame.bind("<s>",self.do_toggle)
	#self.frame.pack()
		
	self.toggle_button = tk.Button(parent, command=self.do_toggle)
	self.toggle_button.pack(side=tk.TOP)
		
	self.update_display()
		
	parent.bind('<s>', self.s_Key)

#@staticmethod
def s_Key(self, event):
	if self.stopwatch.is_running:
		self.stopwatch.stop()
	elif self.stopwatch.elapsed_time:
		self.stopwatch.reset()
	else:
		self.stopwatch.start()
	self.update_display()
		
def update_display(self):
	self.display['text'] = self.stopwatch
	self.toggle_button['text'] = (
		'Stop' if self.stopwatch.is_running else
		'Reset' if self.stopwatch.elapsed_time else 'Start'
	)

def do_toggle(self):
	if self.stopwatch.is_running:
		self.stopwatch.stop()
	elif self.stopwatch.elapsed_time:
		self.stopwatch.reset()
	else:
		self.stopwatch.start()
	self.update_display()
     
def main():
	root = tk.Tk()
	root.title('Zeit stoppen')
	root.configure(background='#008A34')
	root.geometry("1020x815+0+0")
	root.focus_set() ### ist das hier richtig (bei recherche habe ich das in vielen bs. gesehen)
	ui = StopwatchUI(root, Stopwatch())
	ui.pack()
	root.mainloop()

ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Freitag 20. Mai 2016, 18:17

Leute ich habe es hin bekommen mit 'pack_forget' bei Button, leider bin ich mir nicht sicher ob das der richtige weg ist, aber es tut
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Mittwoch 1. Juni 2016, 15:33

hallo,
könntet ihr mir noch mal helfen, ich versuche die Differenz von zb . 10sec - gestoppte zeit in einem label anzuzeigen im moment schaffe ich das nicht, des weiteren versuche ich die Differenz in ein liste zu speichern, aber da tut es auch nicht so wie es soll, es wird nur ein Eintrag gespeichert beim nächstem mal wird mir der Eintrag überschrieben, ich dachte das jedes mal ein neuer Eintrag in die liste rein geschrieben wird fortlaufend Ohne den anderen zu überschreiben zb.
0:00:03.50
0:00:02.65
usw.

Die liste lese ich dann aus und möchte 10 beste die am nächsten an der vorgabe sind möchte ich anzeigen, das scheitert im moment auch, ich lese die liste es wird aber nur die letzte zeit angezeigt und das 10x, irgend etwas habe ich nicht richtig, ich glaube es wäre besser wenn ich das anzeigen der liste auch an stop() anbinde, jedes mal wenn stop gedrückt wird soll die liste aktualisiert werden, wäre das besser?
hier der code

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
	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 reset(self):
	self.elapsed_time = TimeDelta()
	self.start_time = None

#ich habe mir gedacht jedes mal wenn stop gedrückt wird, wird in die liste geschrieben
def write_list(self):
	if self.erg:
		with open('ergebnise.txt', 'w') as f:
			f.write(self.erg)
			# + "\n"
			del self.erg
		f.closed

class StopwatchUI(tk.Frame):
def get_erg(self):
	self.liste = ''
	with open('/ergebnise.txt', 'r') as f:
		for line in f:
			self.liste = line
			print('1111111111', self.liste)
	return self.liste

def update_erg(self):
	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]):
		print('koliko ', self.liste)
		label = tk.Label(self.frame1, text=self.liste, justify=tk.LEFT, font="bold", bg='red',width=50)
		label.pack()
		self.get_erg_widgets.append(label)
	self.frame1.after(2000, self.update_erg)
Zuletzt geändert von Anonymous am Mittwoch 1. Juni 2016, 17:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
ganja
User
Beiträge: 101
Registriert: Mittwoch 3. Dezember 2014, 07:44

Mittwoch 1. Juni 2016, 17:56

wie kann ich meinen Beitrag bearbeiten? Die Anbindung an stop() habe ich hin bekommen, nur noch das auslesen und speichern bekomme ich nicht hin
Antworten