Problem mit "Countdown-Programm" (Thread)

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Dwayne
User
Beiträge: 8
Registriert: Freitag 16. Februar 2007, 12:00

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?
Hand
User
Beiträge: 65
Registriert: Sonntag 28. Januar 2007, 14:28

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()
Dwayne
User
Beiträge: 8
Registriert: Freitag 16. Februar 2007, 12:00

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:
Hand
User
Beiträge: 65
Registriert: Sonntag 28. Januar 2007, 14:28

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
Dwayne
User
Beiträge: 8
Registriert: Freitag 16. Februar 2007, 12:00

Vielen Dank nochmal... :wink:
Antworten