[solved] Wert mittels "Enter" von TextCtrl an Vari

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Hallo,
nachdem ich eine "schmerzliche Entscheidungsphase" hinter mir liegt,

http://www.python-forum.de/posting.php? ... e&p=114083

möchte ich mein Programm neu schreiben ( mittels wxPython). Ich bin die GUI ist erstellt, und nun gehts ans Eingemachte.

Folgender Teil soll so gestaltet werden, dass die eingegebenen Werte nach "Enter" mit onTextCtrl geprüft werden und dann den Variablen zugewiesen werden, um damit weiter zu rechnen (vgl. letztes Posting im o.g. Link).

Code: Alles auswählen

    def createEingabemaske(self,panel):
        """Es werden statische Texte und TextCtrl erzeugt""" 

        #X1 
        self.text = wx.StaticText(panel, -1, u'Wert X1 mit X1 < x',pos=(20,50))
        self.text = wx.StaticText(panel, -1, u'X1=',pos=(20,73)) 
        self.X1 = wx.TextCtrl(panel,'1', size = (80, -1), pos = (55, 70))
        #self.Bind(wx.EVT_TEXT, self.onTextCtrl)
        #X1=ontextCtrl(self.X1)

        #X2 
        self.text = wx.StaticText(panel, -1, u'Wert X2 mit X2 > x',pos=(180,50))
        self.text = wx.StaticText(panel, -1, u'X2=',pos=(180,73))
        self.X2 = wx.TextCtrl(panel,'1', size = (80, -1), pos = (215, 70))
        #X2=ontextCtrl(self.X2)

        #Y1 
        self.text = wx.StaticText(panel, -1, u'Wert Y1 mit Y1 < y',pos=(20,110))
        self.text = wx.StaticText(panel, -1, u'Y1=',pos=(20,133))
        self.Y1 = wx.TextCtrl(panel, '1', size = (80, -1), pos = (55, 130))
        #Y1=ontextCtrl(self.Y1)


        #Y2 
        self.text = wx.StaticText(panel, -1, u'Wert Y2 mit Y2 > y',pos=(180,110))
        self.text = wx.StaticText(panel, -1, u'Y2=',pos=(180,133))
        self.Y2 = wx.TextCtrl(panel, '1', size = (80, -1), pos = (215, 130))
        #Y2=ontextCtrl(self.Y2)

        #x 
        self.text = wx.StaticText(panel, -1, u'Wert x',pos=(20,170))
        self.text = wx.StaticText(panel, -1, u'x=',pos=(20,193))
        self.x = wx.TextCtrl(panel, '1', size = (80, -1), pos = (55, 190))
        #x=ontextCtrl(self.x)

        y=(x-X1)*(Y2-Y1)/(X2-X1)+Y1

        #Statusbar 
        #self.CreateStatusBar(1) 

        #CheckBox 
        #self.cb = wx.CheckBox(self.tb, ID_CB, 'Alle Werte zeigen', (300,5))     


    def onTextCtrl(self, event): 
        """Ueberprueft was der Benutzer eingibt. 
Falls Buchstaben eingegeben werden, wird ein MassageDialog geworfen""" 
        try:
            #Holt den Inhalt des TextCtrl 
            self.pruefe = event.GetString()
            #Ueberprueft ob der Wert ein float ist
            if self.pruefe.find(',')!=-1:
                self.eingabe_new=self.pruefe.replace(',','.')
            else:
                self.eingabe_new=self.pruefe
            return float(self.eingabe_new)           

        except: 
            #Setzt ein das TextCtrl den vorigen Wert ein 
            #self.textctrl.SetValue(str(self.zahl)) 
            dlg = wx.MessageDialog(self, 'Bitte nur Zahlen eingeben!', "powered by wxPython", 
            wx.OK | wx.ICON_ERROR) 
            dlg.ShowModal()
Im Moment funktioniert das ganze natürlich nicht, aber das Gerüst steht erst einmal und ich bitte um Hilfe. Da das Ganze eigentlich mehrere Einzelfragen wären habe ich für den Gesamtüberblick mal die Gesamtproblematik beschrieben.

Mit den einschlägigen Tutorials habe ich mich bereits besschäftigt, aber dort wird immer nur ein Eingabefeld dargestellt :-(. ist es wirklich notwendig für jedes TextCtrl eine eigene (Kontroll)Funktion zu schreiben, die man dann an das jeweilige Feld bindet?. Meine Idee wäre ja eine einzige Kontrollfunktion zu schreiben, mit deren Hilfe ich vom jeweiligen Entry einen Wert der variablen zuweisen kann?

Grüße mathi

edit: Code verändert
edit2: Frage präzisiert :-)
Zuletzt geändert von mathi am Mittwoch 5. November 2008, 12:38, insgesamt 4-mal geändert.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Eine Methode wäre doch :

Code: Alles auswählen

        self.text = wx.StaticText(panel, -1, u'Wert X1 mit X1 < x',pos=(20,50))
        self.text = wx.StaticText(panel, -1, u'X1=',pos=(20,73)) 
        self.X1 = wx.TextCtrl(panel,ID_TC, '1', size = (80, -1), pos = (55, 70))
        self.Bind(wx.EVT_TEXT, self.X1Ctrl)# , id = ID_TC)
        X1=self.X1
        print X1
    def X1Ctrl(self, event): 
        """Ueberprueft was der Benutzer eingibt. Durch das Event wx.EVT_TEXT wird bei Eingabe
        eines Zeichens in dem TextCtrl-Feld direkt ein Ueberpruefung gestartet. Falls Buchstaben 
        eingegeben werden, wird ein MassageDialog geworfen""" 
        try:
            #Holt den Inhalt des TextCtrl 
            self.pruefe = event.GetString()
            if self.pruefe.find(',')!=-1: 
                self.eingabe_new=self.pruefe.replace(',','.') 
            else: 
                self.eingabe_new=self.pruefe 
            self.X1=float(self.eingabe_new)

        except ValueError: 
            #Setzt ein das TextCtrl den vorigen Wert ein 
            #self.textctrl.SetValue(str(self.zahl)) 
            dlg = wx.MessageDialog(self, 'Bitte nur Zahlen eingeben!', "powered by wxPython", 
            wx.OK | wx.ICON_ERROR) 
            dlg.ShowModal()

Aber das für jede Variaable ist doch bestimmt dumm oder?
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

folgende Lösungfunktioniert zumindest, aber ich habe folgendes Problem:
ich möchte im 1. textCtrl (X1) keinen Startwert haben, wenn ich das aber tue, greift bei Klick in das Feld der except-Fehler. wie kann ich das unterdrücken?

- war eine dumme Frage: ich habe die Kontrolfunktion entsprechend verändert :-)

Code: Alles auswählen

    def createEingabemaske(self,panel):
        """Es wird eine Toolbar erzeugt die einen statischen Text hat, 
        ein TextCtrl und eine CheckBox beinhaltet. Noch wird eine Statusbar erzeugt""" 

        # ,style=wx.LC_REPORT = Laufleiste
        #X1 
        self.text = wx.StaticText(panel, -1, u'Wert X1 mit X1 < x',pos=(20,50))
        self.text = wx.StaticText(panel, -1, u'X1=',pos=(20,73)) 
        self.tcX1 = wx.TextCtrl(panel,ID_TC, '1', size = (80, -1), pos = (55, 70))
        self.tcX1.Bind(wx.EVT_TEXT_ENTER, self.onTextCtrl)
        
        #X2 
        self.text = wx.StaticText(panel, -1, u'Wert X2 mit X2 > x',pos=(180,50))
        self.text = wx.StaticText(panel, -1, u'X2=',pos=(180,73))
        self.tcX2 = wx.TextCtrl(panel, ID_TC,'1', size = (80, -1), pos = (215, 70))
        self.tcX2.Bind(wx.EVT_TEXT_ENTER, self.onTextCtrl)
        #Y1 
        self.text = wx.StaticText(panel, -1, u'Wert Y1 mit Y1 < y',pos=(20,110))
        self.text = wx.StaticText(panel, -1, u'Y1=',pos=(20,133))
        self.tcY1 = wx.TextCtrl(panel,ID_TC, '1', size = (80, -1), pos = (55, 130))
        self.tcY1.Bind(wx.EVT_TEXT_ENTER, self.onTextCtrl)
        #Y2 
        self.text = wx.StaticText(panel, -1, u'Wert Y2 mit Y2 > y',pos=(180,110))
        self.text = wx.StaticText(panel, -1, u'Y2=',pos=(180,133))
        self.tcY2 = wx.TextCtrl(panel, ID_TC,'1', size = (80, -1), pos = (215, 130))
        self.tcY2.Bind(wx.EVT_TEXT_ENTER, self.onTextCtrl)
        #x 
        self.text = wx.StaticText(panel, -1, u'Wert x',pos=(20,170))
        self.text = wx.StaticText(panel, -1, u'x=',pos=(20,193))
        self.tcx = wx.TextCtrl(panel, ID_TC,'1', size = (80, -1), pos = (55, 190))
        self.tcx.Bind(wx.EVT_TEXT_ENTER, self.onTextCtrl)
        
        self.Bind(wx.EVT_TEXT, self.onTextCtrl, id = ID_TC) #Bindet das TextCtrl mit der Ueberpruefung nach Buchstaben

    def float_input(self,tc):            
        try:
            #Holt den Inhalt des TextCtrl 
            self.pruefe = tc
            if self.pruefe.find(',')!=-1: 
                self.eingabe_new=self.pruefe.replace(',','.') 
            else: 
                self.eingabe_new=self.pruefe 
            return float(self.eingabe_new)  
        except ValueError: 
            #Setzt ein das TextCtrl den vorigen Wert ein 
            #self.textctrl.SetValue(str(self.zahl)) 
            dlg = wx.MessageDialog(self, 'Bitte nur Zahlen eingeben!', "powered by wxPython", 
            wx.OK | wx.ICON_ERROR) 
            dlg.ShowModal()
                
    #X1=self.onTextCtrl
    def onTextCtrl(self, event): 
        """Ueberprueft was der Benutzer eingibt. Durch das Event wx.EVT_TEXT wird bei Eingabe
        eines Zeichens in dem TextCtrl-Feld direkt ein Ueberpruefung gestartet. Falls Buchstaben 
        eingegeben werden, wird ein MassageDialog geworfen"""
       
        self.X1=self.float_input(self.tcX1.GetValue())
        self.X2=self.float_input(self.tcX2.GetValue())
        self.Y1=self.float_input(self.tcY1.GetValue())
        self.Y2=self.float_input(self.tcY2.GetValue())
        self.x=self.float_input(self.tcx.GetValue())
        
    def onCalc(self,event):
        X1=self.X1
        X2=self.X2
        Y1=self.Y1
        Y2=self.Y2
        x=self.x
        y=(x-X1)*(Y2-Y1)/(X2-X1)+Y1
        ergebnis1= u'y= %s' % self.format(y)
        self.Ergebnis1.SetLabel(ergebnis1)
Antworten