Anfänger Problem mit EVT_TEXT bzw. GetString()

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Hallo!

Ich habe folgendes Problem mit EVT_TEXT bzw. GetString().

Ziel:

Ich möchte eine Eingabe in ein TextCtrl machen und mit den Werten dann weiterrechnen.

Ich habe das ganze schon auf Konsole fertig und es funktioniert.
Jetzt wollte ich das ganze mit wxPython umsetzen:

Code: Alles auswählen

# -*- coding: cp1252 -*-

import wx

class MyFrame(wx.Frame):

    def __init__(self, parent, id):

        # Layout
        wx.Frame.__init__(self, parent, id, 'Lösungsberechner',
                          size=(340, 300))
        panel = wx.Panel(self, -1)
        panel.SetBackgroundColour("White")

        static_verb = wx.StaticText(panel, wx.NewId(), "Verbindung", pos=(10, 50))
        static_verb.SetBackgroundColour("White")
        entry_verb = wx.TextCtrl(panel, wx.NewId(), "", size=(100, -1),
                                 pos=(80, 50))

        static_exs = wx.StaticText(panel, wx.NewId(), "Beispiel: Ba(OH)2", pos=(80, 80))
        static_exs.SetBackgroundColour("White")

        static_mol = wx.StaticText(panel, wx.NewId(), "Molarität", pos=(10, 100))
        entry_mol = wx.TextCtrl(panel, wx.NewId(), "", size=(100, -1),
                                 pos=(80, 100))
        
        static_molL = wx.StaticText(panel, wx.NewId(), "mol/L", pos=(190, 100))
        static_molL.SetBackgroundColour("White")

        static_vol = wx.StaticText(panel, wx.NewId(), "Volumen", pos=(10, 150))
        entry_vol = wx.TextCtrl(panel, wx.NewId(), "", size=(100, -1),
                                 pos=(80, 150))
        
        static_liter = wx.StaticText(panel, wx.NewId(), "L", pos=(190, 150))
        static_liter.SetBackgroundColour("White")

        ok_button = wx.Button(panel, -1, "Ok", pos=(80, 200))

        self.Bind(wx.EVT_TEXT, self.get_verb, entry_verb)
        self.Bind(wx.EVT_TEXT, self.get_mol, entry_mol)
        self.Bind(wx.EVT_TEXT, self.get_vol, entry_vol)
        self.Bind(wx.EVT_BUTTON, self.berechne, ok_button)

    def get_verb(self, event):
        # Chemische Verbindung
        verb = event.GetString()
        return verb

    def get_mol(self, event):
        # Molarität
        mol = event.GetString()
        return mol

    def get_vol(self, event):
        # Volumen
        volumen = event.GetString()
        return volumen

    def berechne(self, event):
        verbindung = get_verb(self, event)
        mola = get_mol(self,event)
        vol = get_vol(self, event)
        # Molare Masse Dictionary
        mm = {'BaSO4': ('Bariumsulfat', '233'), 'CaC2': ('Calciumcarbid', '64.1')}
        # Formel
        masse = float(mm[verbindung][1]) * float(vol) * float(mola)
        # Ausgabe
        static_ausg = wx.StaticText(panel, wx.NewId(), text=masse, pos=(200, 150))
  

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = MyFrame(parent=None, id=-1)
    frame.Show()
    app.MainLoop()
1) Wenn ich die Berechnung in def __init__ lege funktioniert alles.

2) Wenn ich das Script oben laufen lasse, bekomme ich folgende Fehlermeldung (auf Konsole funktioniert's):

NameError: global name 'get_verb' is not defined

2) Wenn ich verb in get_verb() mit print ausgebe und in dem Dictionary raussuchen lasse, funktioniert das.
Ich bekomme aber solange eine KeyError Fehlermeldung, bis die Verbindung vollständig eingegebn wurde.
Wie kann ich nach dem kompletten String suchen und nicht jedesmal,
wenn ich einen Buchstaben eingebe? Ausserdem funktioniert die nur, wenn das Dict innerhalb der Funktion ist.

3) Kann ich im StaticText mein Ergebnis so ausgeben (text=masse)?

Liebe Grüsse

Stefanie
midan23
User
Beiträge: 147
Registriert: Sonntag 21. Mai 2006, 21:41
Wohnort: Müchen
Kontaktdaten:

Zu 2)

Ich würde in Zeile 60 das get_verb durch self.get_verb ersetzen und den ersten Parameter self einfach weglassen ...
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Danke!

Ich bekomme jetzt aber eine KeyError Fehlermeldung:

Traceback (most recent call last):
masse = mm[verbindung][1] * float(vol) * float(mola)
KeyError: ''

Bei einer normalen raw_input Eingabe funktioniert alles...

Liebe Grüsse

Stefanie
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

get_verb, get_mol und get_vol liefern doch alle dasselbe Ergebnis zurück. Die Fehlermeldung sieht anders aus als Deine Zeile 66 (fehlendes float(...)). Du musst wohl noch mal grundlegend darüber nachdenken.
MfG
HWK
Antworten