Seite 1 von 1

Stoppuhr

Verfasst: Mittwoch 15. September 2010, 19:56
von pythonstarter
Hallo, wollte mal eine Stoppuhr in tkinter basteln, komme aber grad nicht weiter. Da hab ich einen Hänger.

Code: Alles auswählen

import tkinter as tk, time

main = tk.Tk()

def uhr():
    label = tk.Label(main, text = "")
    label.pack()
    second = 0
    while second < 60:
        label.configure(text = second)
        second +=  1
        time.sleep(1)
    
button = tk.Button(main, text = "Stopuhr - Start", command = uhr)
button.pack()

main.mainloop()

Hat jemand einen Tipp - ist sicher mal wieder ganz einfach und ich komm ´nicht drauf :oops:

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 20:31
von problembär
time.sleep() blockiert Dein gesamtes GUI. Du suchst tkrootwidget.after(). Guckstu hier.

Gruß

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 20:44
von pythonstarter
und wie und wo bau ich das in mein script ein`?

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 20:52
von numerix
pythonstarter hat geschrieben:und wie und wo bau ich das in mein script ein`?
Gar nicht. - Wenn das Programm nichts anderes tun soll als sichtbar zu zählen, dann genügt ein
label.update() nach dem label.configure(...).

Die after()-Methode solltest du dir trotzdem mal zu Gemüte führen.

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 21:45
von pythonstarter
man möge mir verzeihen - - - ich komm nicht weiter.
könnte mir mal jemand die funktion mal in mein script einbauen? das wäre echt super
Dankeschön.

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 21:52
von yipyip
In Dein Script kann ichs' Dir nicht einbauen, nur zeigen, wie ich das gemacht habe:

Code: Alles auswählen

import Tkinter as tk

class Gui(object):


  def __init__(self, counter):

    self.root = tk.Tk()
    self.counter = counter
    self.ivar = tk.IntVar()
    self.ivar.set(counter)
    self.label = tk.Label(textvariable=self.ivar, width=2, font=('ARIAL', 200, 'bold'))
    self.label.pack()

    self.count()

    
  def count(self, speed=1000):

    self.counter -= 1
    if self.counter >= 0:
      self.ivar.set(self.counter)
      self.root.after(speed, self.count)     
    else:
      self.root.quit()
    
      
  def run(self):
    
    self.root.mainloop()


if __name__ == '__main__':

  Gui(12).run()
:wink:
yipyip

Re: Stoppuhr

Verfasst: Mittwoch 15. September 2010, 22:11
von numerix
pythonstarter hat geschrieben:man möge mir verzeihen - - - ich komm nicht weiter.
könnte mir mal jemand die funktion mal in mein script einbauen? das wäre echt super
Dankeschön.
Hä? Ich hab dir doch genau beschrieben, was du machen musst!
Also, wenn dir das nicht reicht, dann solltest du vielleicht einmal mit den Basics beginnen und die GUI-Programmierung vorerst hintenanstellen.

Re: Stoppuhr

Verfasst: Donnerstag 16. September 2010, 23:43
von problembär
pythonstarter hat geschrieben:könnte mir mal jemand die funktion mal in mein script einbauen?
Ja:

Code: Alles auswählen

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

import tkinter as tk

def uhr(main, label, second):

    if second <= 60:
        label.configure(text = str(second))
        second += 1
        main.after(1000, lambda: uhr(main, label, second))
   
main = tk.Tk()
label = tk.Label(main, text = "")
label.pack()
button = tk.Button(main, text = "Stopuhr - Start", command = lambda: uhr(main, label, 0))
button.pack()
main.mainloop()
Warum glaubst Du mir nicht, daß sowas besser mit OOP zu lösen ist?
Dann brauchst Du nämlich nicht all diese Argumente mit zu übergeben.

Gruß

Re: Stoppuhr

Verfasst: Freitag 17. September 2010, 00:02
von BlackJack
Wobei bei den ganzen Beispielen weder `time.sleep()` noch `after()` harte Garantien über die verstrichene Zeit machen. Mit jeder Sekunde addieren sich da also eventuell bis wahrscheinlich Fehler. Man sollte `after()` nur als Auslöser für eine Aktualisierung verwenden und die tatsächliche Zeit aus der Systemzeit ermitteln.

Edit: @problembär: `main` schleppst Du da eigentlich nur als Argument mit um `after()` darauf aufzurufen -- die Methode gibt es aber auf jedem Widget. `label` müsste also ausreichen.

Re: Stoppuhr

Verfasst: Freitag 17. September 2010, 03:08
von pythonstarter
Hi problembär,
vielen Dank. :)
und natürlich auch an die anderen.

Re: Stoppuhr

Verfasst: Freitag 17. September 2010, 16:17
von yipyip
@pythonstarter: Hier nochmal eine "richtige" Stoppuhr:
http://paste.pocoo.org/show/263224/
bzw.
http://www.python-forum.de/pastebin.php?mode=view&s=70
:wink:
yipyip

Re: Stoppuhr

Verfasst: Freitag 17. September 2010, 17:11
von problembär
BlackJack hat geschrieben:Wobei bei den ganzen Beispielen weder `time.sleep()` noch `after()` harte Garantien über die verstrichene Zeit machen. Mit jeder Sekunde addieren sich da also eventuell bis wahrscheinlich Fehler. Man sollte `after()` nur als Auslöser für eine Aktualisierung verwenden und die tatsächliche Zeit aus der Systemzeit ermitteln.
Ja, hab' ich beim Schreiben auch schon dran gedacht.
BlackJack hat geschrieben:Edit: @problembär: `main` schleppst Du da eigentlich nur als Argument mit um `after()` darauf aufzurufen -- die Methode gibt es aber auf jedem Widget. `label` müsste also ausreichen.
Auch das stimmt. Allerdings hab' ich mal mit ".bind()" einige Tasten an Buttons oder Canvases gebunden. Das hat dazu geführt, daß die Tasten nur dann gingen, wenn das jeweilige Widget den Fokus hatte (was nicht gewollt war). Seitdem lege ich so globale Sachen am liebsten auf das main-Widget.

Gruß