Wert pro Zeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Samstag 6. Dezember 2008, 20:59

Hallo zusammen,

Ich habe ein echt blödes Problem. Klingt einfach aber ich krieg das nich hin bzw. ich weiss nic wie ich das machen soll...

Also Ich habe einen Wert:

Code: Alles auswählen

a = 1
Nun will ich, das sich Variable 'a' beispielsweise alle 4 Sekunden um 1 erhöht. Das Modul time sollte da ja eigentlich der richtige fundort sein. Kann da aber nix finden. Bitte HILFE!!![/code]
DasIch
User
Beiträge: 2452
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Samstag 6. Dezember 2008, 21:08

Code: Alles auswählen

from time import sleep
a = 0
while True:
    sleep(4)
    i += 1
;)

Schreib mal was du wirklich vorhast und was dein wirkliches Problem ist dann bekommst du auch eine wirklich brauchbare Antwort.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 6. Dezember 2008, 21:17

4 Sekunden bis zum Abbruch ... :D

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    i += 1
NameError: name 'i' is not defined
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Samstag 6. Dezember 2008, 21:19

Erstmal danke für die antwort.

Ich habe Regeltechniker gelernt und will mir mit Python ein Regelkreis simulieren. Also quasi a aus dem oberen Beitrag ist das Wasser in einem Wasserbecken. Nun ist die Wassermenge, die ins Becken reinläuft b.

Nun will ich eine Anzeige haben wieviel Wasser nach Zeit X ins Becken gelaufen ist bzw. die Literzahl immer im Auge behalten. Wie ich die Anzeige mache ist mir schon klar. Nur das ganze über die Zeit steigen zu lassen wusste ich nich.

aber mal ne Frage: Schläft mit dem Befehl sleep das komplette Programm? Soll heißen wenn ich eine GUI habe, die einen EventHandler hat, "schläft" der dann auch? Hatte das Problem mal mit wxPython und twisted.
silentpolygon
User
Beiträge: 9
Registriert: Montag 14. Mai 2007, 21:49

Samstag 6. Dezember 2008, 21:20

@numerix

Muss dann natürlich a+=1 heissen oder die Variable oben in i umbenennen oder?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 6. Dezember 2008, 21:31

silentpolygon hat geschrieben:Schläft mit dem Befehl sleep das komplette Programm? Soll heißen wenn ich eine GUI habe, die einen EventHandler hat, "schläft" der dann auch? Hatte das Problem mal mit wxPython und twisted.
Hallo silentpolygon!

Mit ``sleep`` schläft der aktuelle Thread. Wenn du in deinem Programm nur einen Thread hast, dann schläft das ganze Programm.

wxPython bietet dafür den ``wx.Timer``. Der löst nach einer vorgegebenen Zeit das ``wx.EVT_TIMER``-Event aus. So etwas ist aber nie besonders genau. Deshalb löst man normalerweise mehrmals die Sekunde diesen Event aus und prüft anhand der Uhrzeit, ob eine Sekunde vergangen ist oder nicht.

mfg
Gerold
:-)

PS: Beispiel:

Code: Alles auswählen

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

import wx
import time

wx.SetDefaultPyEncoding("iso-8859-15")


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, title = "Example"):
        wx.Frame.__init__(self, parent, -1, title)
        
        panel = wx.Panel(self)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox)
        
        self.label = wx.StaticText(panel, label = "<Uhrzeit im 10-Sekundentakt>")
        vbox.Add(self.label, 0, wx.ALL, 10)
        
        self.old_time = time.time()
        
        self.timer = wx.Timer()
        self.timer.Bind(wx.EVT_TIMER, self.on_timer)
        self.timer.Start(200)
        
        panel.Fit()
        self.Fit()
    
    
    def on_timer(self, event):
        new_time = time.time()
        if new_time - self.old_time >= 10:
            self.old_time = new_time
            self.label.SetLabel(time.strftime("%H:%M:%S"))


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
.
Zuletzt geändert von gerold am Samstag 6. Dezember 2008, 22:42, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
abgdf

Samstag 6. Dezember 2008, 22:03

Hallo,

das geht auch in Tkinter, z.B. so:

Code: Alles auswählen

#!/usr/bin/env python

import Tkinter
from Tkconstants import *

class myWindow:

    def __init__(self):

        self.a = 0

        self.mw = Tkinter.Tk()
        self.mw.option_add("*font", ("Arial", 15, "normal"))
        self.mw.title('Raising "a"')
        self.mw.geometry("+250+200")

        self.lab1 = Tkinter.Label(self.mw,
                                  text = 'a = ' + str(self.a))
        self.lab1.pack(padx = 100, pady = 100)

        self.btn1 = Tkinter.Button(self.mw,
                                   text = "Exit",
                                   command = self.mw.destroy)
        self.btn1.pack(padx = 10, pady = 10)

        self.mw.after(ms = 4000, func = self.raiseA)

        self.mw.mainloop()

    def raiseA(self):

        self.a += 1
        self.lab1.configure(text = 'a = ' + str(self.a))
        self.mw.after(ms = 4000, func = self.raiseA)

if __name__ == "__main__":
   app = myWindow()
Gruß
Antworten