Seite 1 von 1

Problem mit "Countdown-Programm" (Thread)

Verfasst: Sonntag 18. Februar 2007, 20:21
von Dwayne
Hallo erstmal.

Ich habe eine Frage zu meinem Programm, dessen Quelltext ihr unten sehen könnt:

Vorab: Recht zügig bin ich als Python-Neuling am jetzigen Punkt angekommen. Ein Lob auf die umfassenden Dokumentationen im Internet...

Das Programm soll eine vom User bestimmte Zahl runterzählen. Das tut es soweit auch. Aber nach Modifikation und Einfügen einer Schleife, zählt das Programm "wert" nicht mehr runter. Das Ausgabe-Fenster bleibt auf 12 stehen.

Code: Alles auswählen

import wx
import time
import winsound
from thread import start_new_thread

class Counter(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self,parent,id,)
        self.eingabe = wx.TextCtrl(self,10,"",wx.Point(70,20))
        self.ausgabe = wx.TextCtrl(self,20,"00",wx.Point(70,50))
        self.button1 = wx.Button(self,30,"Starten",wx.Point(80,80),wx.Size(80,25))
        self.Bind(wx.EVT_BUTTON,self.OnStart,self.button1)
        
    def OnStart(self,event):
        wert = self.eingabe.GetValue()
        self.ausgabe.SetValue(wert)
        start_new_thread(self.thread,())
   
    def thread(self):
        wert = self.eingabe.GetValue()
        while (wert > 0):
            self.ausgabe.SetValue(str(wert))
            wert = int(wert) - 1
            time.sleep(1)

#==========================================================================
# Sobald die folgenden Anweisungen die Anweisungen 
# aus den Zeilen 22-24 ersetzen sollen, funktioniert das 
# Programm nicht mehr
#
#            if wert < 10:
#                self.ausgabe.SetValue("0" + str(wert))
#                #print(str(wert))
#                wert = int(wert) - 1
#                time.sleep(1)
#            if wert == 0:
#                self.ausgabe.SetValue("00")
#
#==========================================================================

app = wx.PySimpleApp()
frame = wx.Frame(None,-1,"Counter",size=(250,180))
Counter(frame,-1)
frame.Show(1)
app.MainLoop()
Eine Fehlermeldung wird nicht ausgeben, aber wo ist der Konflikt?

Verfasst: Sonntag 18. Februar 2007, 21:44
von Hand
statt

if wert < 10:

muss es heissen

if wert > 0:

allerdings finde ich es immer sauberer in einer Variable zu zählen

Code: Alles auswählen

import wx
import time
import winsound
from thread import start_new_thread

class Counter(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self,parent,id,)
        self.eingabe = wx.TextCtrl(self,10,"",wx.Point(70,20))
        self.ausgabe = wx.TextCtrl(self,20,"00",wx.Point(70,50))
        self.button1 = wx.Button(self,30,"Starten",wx.Point(80,80),wx.Size(80,25))
        self.Bind(wx.EVT_BUTTON,self.OnStart,self.button1)
        self.wert = 0
        start_new_thread(self.thread,())

    def OnStart(self,event):
        self.wert = int(self.eingabe.GetValue())
        self.ausgabe.SetValue(str(self.wert))

    def thread(self):
        while 1:
            time.sleep(1.0)
            if(self.wert > 0): self.wert = self.wert - 1
            self.ausgabe.SetValue(str(self.wert))


app = wx.PySimpleApp()
frame = wx.Frame(None,-1,"Counter",size=(250,180))
Counter(frame,-1)
frame.Show(1)
app.MainLoop()

Verfasst: Montag 19. Februar 2007, 16:19
von Dwayne
Danke für den Hinweis! :)

In einem anderen Thread hab ich gelesen, dass man Threads in Python grundsätzlich nicht "killen" kann. Ich wollte dem Anwender aber die Möglichkeit geben, mithilfe eines weiteren Buttons, den "Zählvorgang" zu unterbrechen und dann ggf. neuzustarten. Da muss es doch die Möglichkeit geben?! :lol:

Verfasst: Montag 19. Februar 2007, 17:03
von Hand
Einfach das while 1 durch eine globale Variable ersetzen

z.b. bei init die Variable initialisieren self.runthread = True

und im thread dann

while self.runthread:

dann läuft der Thread solange die Variable True ist

Verfasst: Montag 19. Februar 2007, 17:40
von Dwayne
Vielen Dank nochmal... :wink: