Mit Auwahl ComboBox1 SampleList von ComboBox2 wählen

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

Donnerstag 1. November 2007, 09:35

Hallo!

ich habe 2 ComboBoxen und möchte mit der Auswahl der ersten die SampleList der 2 bestimmen.

Code: Alles auswählen

class TestComboBox(wx.Panel):
    def __init__(self, parent):
        # ...

        sampleList1 = ['a', 'b', 'c']
        sampleList2 = self.EvtComboBox(evt)

        # ...

        cb = wx.ComboBox(self, 501, "default value", (90, 80), (95, -1), sampleList1, wx.CB_DROPDOWN)

        cb = wx.ComboBox(self, 501, "default value", (150, 100), (95, -1), sampleList2, wx.CB_DROPDOWN)
        # ...

        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, cb)

    def EvtComboBox(self, evt):
            if evt.GetString() == 'a':
                sampleList2 = ['eins', 'zwei', 'drei']

# ...
Ich wollte es so machen aber bekomme dann eine Fehlermeldung das evt nicht definiert ist. Gut ist klar, aber wie kann ich die SampleList2 je nach Auswahl von SampleList1 updaten?

Kann jemand helfen?

Liebe Grüsse

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

Donnerstag 1. November 2007, 14:07

Es wäre schön, wenn Du Code posten würdest, der den Fehler reproduziert.

Code: Alles auswählen

sampleList2 = self.EvtComboBox(evt)
funktioniert aber natürlich nicht und dürfte den Fehler auslösen. Du kannst die 2. Liste wahrscheinlich nur anpassen, indem Du sie mit combobox2.clear() löschst und dann die neuen Elemente mit combobox2.append(element) einzeln hinzufügst.
MfG
HWK
ete
User
Beiträge: 218
Registriert: Montag 19. Februar 2007, 13:19
Kontaktdaten:

Montag 5. November 2007, 10:02

Danke, das funktioniert!

Ich habs jetzt so gemacht! (Das ganze wird dann in ein Notebook geladen.)

Code: Alles auswählen

import wx

class MyFrame(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)                

# --------------------------------------------------------------------------------------------------
        sampleList1 = ['Arbeit / Energie', 'Beschleunigung', 'Druck',
                      'Euro-Währung', 'Fläche', 'Geschwindigkeit',
                      'Kraft', 'Länge / Entfernung', 'Leistung', 'Masse',
                      'Speicherplatz (PC)', 'Temperatur', 'Volumen', 'Winkel',
                      'Zeit']
        liste = []
        
        ### Controlls
        # Text
        topLbl = wx.StaticText(self, -1, "Unit Converter")

        # Text layout
        topLbl.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD))
        topLbl.SetForegroundColour('orchid')
        
        # Combo Box Units
        self.cb_variable = wx.ComboBox(self, -1, 'Arbeit / Energie', (50, 90), (-1, -1),
                                       sampleList1, wx.CB_READONLY)
        self.cb_unit1 = wx.ComboBox(self, -1, "", (50, 90),
                                    (250, -1), liste, wx.CB_READONLY|wx.CB_SORT)
        self.cb_unit2 = wx.ComboBox(self, -1, "", (50, 90),
                                    (250, -1), liste, wx.CB_READONLY|wx.CB_SORT)

        # Eingabe Felder
        self.einheit01 = wx.TextCtrl(self, size=(80, -1))
        self.einheit02 = wx.TextCtrl(self, size=(80, -1))

        # Button
        okBtn = wx.Button(self, -1, "Ok")

# --------------------------------------------------------------------------------------------------
        ### Layout
        # MainSizer
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(topLbl, 0, wx.ALL, 5)
        mainSizer.Add(wx.StaticLine(self), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)

        # Sizer for ComboBox, OkBtn
        sizer = wx.GridBagSizer(hgap=5, vgap=5)
        sizer.Add(self.cb_variable, pos=(0, 0), flag=wx.EXPAND)
        sizer.Add(self.cb_unit1, pos=(1, 1), flag=wx.EXPAND)
        sizer.Add(self.cb_unit2, pos=(2, 1), flag=wx.EXPAND)
        sizer.Add(self.einheit01, pos=(1, 0))
        sizer.Add(self.einheit02, pos=(2, 0))
        sizer.Add(okBtn, pos=(3, 0))

        mainSizer.Add(sizer, 0, wx.EXPAND|wx.ALL, 10)
        self.SetSizer(mainSizer)
        mainSizer.Fit(self)
        mainSizer.SetSizeHints(self)

# --------------------------------------------------------------------------------------------------
        # Evt Binding
        self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.cb_variable)
        self.Bind(wx.EVT_COMBOBOX, self.berechne, self.cb_unit1)
        self.Bind(wx.EVT_COMBOBOX, self.berechne, self.cb_unit2)
        self.Bind(wx.EVT_BUTTON, self.ausgabe, okBtn)

# --------------------------------------------------------------------------------------------------

    # Funktionen
    def EvtComboBox(self, evt):
        if evt.GetString() == 'Arbeit / Energie':
            self.cb_unit1.Clear()
            self.cb_unit2.Clear()
            liste = ['Joule [J]', 'Kilowattstunde [kW h]', 'Kalorie [cal]',
                     'Kilokalorie [kcal]', 'Tonne Steinkohleneinheiten [t SKE]',
                     'Erg [erg]', 'Elektronvolt [eV]']
            for item in liste:
                self.cb_unit1.Append(item)
                self.cb_unit2.Append(item)

        elif evt.GetString() == 'Beschleunigung':
            self.cb_unit1.Clear()
            self.cb_unit2.Clear()
            liste = ['Meter pro Sekunde² [m/s²]', 'Erdanziehung [g]',
                     'Galileo [Gal]']
            for item in liste:
                self.cb_unit1.Append(item)
                self.cb_unit2.Append(item)
      # usw....

# Werte berechnen
    def berechne(self, evt):
        value_unit1 = self.einheit01.GetValue()
        unit1 = self.cb_unit1.GetValue()
        unit2 = self.cb_unit2.GetValue()
        if unit1 == 'Sekunde [s]':
            factor1 = float(2)
        if unit2 == 'Minute [m]':
            factor2 = float(60)
        end_value = float(value_unit1) * factor1 / factor2
        return end_value
        
    def ausgabe(self, evt):
        end_value = self.berechne(evt)
        self.einheit02.AppendText(str(end_value))
        
Bekomme nur leider folgenden Fehler:
UnboundLocalError: local variable 'factor1' referenced before assignment

Kann man generell 2 ComboBoxen auf ein Event verweisen?
Wenn ich einen factor auslasse, funktioniert alles...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Montag 5. November 2007, 19:00

Das Problem liegt in den Zeilen 95-99: Wenn unit1 oder unit2 falsch sind, sind factor1 bzw. factor2 nicht definiert. Du mußt den Faktoren evtl. einen Standardwert zuweisen.
MfG
HWK
Antworten