CheckBox aus einer funktion heraus checken

Plattformunabhängige GUIs mit wxWidgets.
Antworten
ensacom

Hallo, ich lese aus einer Datei den Wert true oder false aus.
Wie kann ich nun eine Checkbox je nach ausgelesenem Wert checken oder eben den Hacken entfernen?

Vielen Dank
Benutzeravatar
Hobbes Hobson
User
Beiträge: 42
Registriert: Sonntag 9. Dezember 2007, 15:24
Wohnort: Bremen

Code: Alles auswählen

cb2 = wx.CheckBox(self, -1, "Oranges")#, (65, 60), (150, 20), wx.NO_BORDER)
cb2.SetValue(True)
einfach mal in die Doku oder Demo gucken ;)
ensacom

Hallo, das habe ich so ähnlich versucht.
Hier mal mein code, ich benutze Boa Constrictor, der erste Teil ist also automatisch generiert worden

Code: Alles auswählen

self.cbEnergieversorgung = wx.CheckBox(id=wxID_FRAME1CBENERGIEVERSORGUNG,
              label=u'Energieversorgung', name=u'cbEnergieversorgung',
              parent=self, pos=wx.Point(24, 91), size=wx.Size(184, 22),
              style=0)
        self.cbEnergieversorgung.SetValue(False)
        self.cbEnergieversorgung.Bind(wx.EVT_CHECKBOX,
              self.OnCbEnergieversorgungCheckbox,
              id=wxID_FRAME1CBENERGIEVERSORGUNG)

Hier die Funktion aus der ich die checkbox bearbeiten will.

Code: Alles auswählen

def ReadSettings(self):
        
        home = os.path.expanduser("~")
        if not os.path.exists(home+'/.OLED'): 
            os.chdir(home)
            os.mkdir('.OLED')
            print 'Verzeichnis angelegt'
        
        if not os.path.exists(home+'/.OLED/settings.conf'):
            datei = open(home+'/.OLED/settings.conf','w')
            datei.write('datumuhrzeit=true\n')
            datei.write('energieversorgung=true\n')
            datei.write('akuzustand=true\n')
            datei.write('cputemperatur=true\n')
            datei.write('traffic=true\n')
            datei.write('newmails=false\n')
            datei.write('switch=15\n')
            datei.write('resettraffic=19\n')
            datei.close()
            print 'Datei angelegt'
        else:
            datei = open(home+'/.OLED/settings.conf', 'r')
            line = datei.readlines()
                
            for i in range(len(line)):
                line[i] = line[i].split("=")
                datum=line[0][1]
                energie=line[1][1]
                akku=line[2][1]
                cpu=line[3][1]
                traffic=line[4][1]
                mail=line[5][1]
                switch=line[6][1]
                reset=line[7][1]

            datei.close()
            print reset
            self.cbEnergieversorgung.setValue(reset) #reset steht eben True oder False
Ich bekomme die Fehlermeldung

Code: Alles auswählen

AttributeError: Checkbox has no attribute 'SetValue'
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ensacom hat geschrieben:

Code: Alles auswählen

            self.cbEnergieversorgung.setValue(reset) #reset steht eben True oder False
Hallo ensacom!

Achte auf die Groß-/Kleinschreibung. Ein ``setValue`` gibt es nicht.

Nur die von dir gezeigte Fehlermeldung passt nicht dazu.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ensacom

Ok, das hat was gebracht. JEtzt ein neues Problem. Ich übergbe ja das True oder False per Variable deren Inhalt ich aus der datei auslese,

Jetzt bekomme ich folgende Fehlermeldung

Code: Alles auswählen

True

Traceback (most recent call last):
  File "/home/ensacom/Projekte/OLED/Frame1.py", line 124, in OnCbDatumCheckbox
    self.ReadSettings()
  File "/home/ensacom/Projekte/OLED/Frame1.py", line 194, in ReadSettings
    self.cbEnergieversorgung.SetValue(energie)
  File "/usr/lib/python2.5/site-packages/wx-2.8-gtk2-unicode/wx/_controls.py", line 384, in SetValue
    return _controls_.CheckBox_SetValue(*args, **kwargs)
TypeError: in method 'CheckBox_SetValue', expected argument 2 of type 'bool'
Ich denke ich muss den String "True" in einen Boolschen Wert umwandeln.
Wie mache ich das?
BlackJack

Code: Alles auswählen

In [101]: s = 'True'

In [102]: s == 'True'
Out[102]: True

In [103]: s = 'Irgendwas'

In [104]: s == 'True'
Out[104]: False
ensacom

Nimms mir bitte nicht übel aber ich weiß gerade nicht was du mir damit sagen willst.

Wenn Du das meinst, das funktioniert auch nicht. Es wird True ausgegeben aber trotzdem wird es nicht markiert

Code: Alles auswählen

print energie
            if energie == 'True':
               self.cbEnergieversorgung.SetValue(True)
            else:
               self.cbEnergieversorgung.SetValue(False) 
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ensacom hat geschrieben:Es wird True ausgegeben aber trotzdem wird es nicht markiert

Code: Alles auswählen

print energie
            if energie == 'True':
               self.cbEnergieversorgung.SetValue(True)
            else:
               self.cbEnergieversorgung.SetValue(False) 
Hallo ensacom!

Ändere deinen Code so um:

Code: Alles auswählen

            print repr(energie)
            if energie == 'True':
               self.cbEnergieversorgung.SetValue(True)
               print "TRUE gesetzt"
            else:
               self.cbEnergieversorgung.SetValue(False)
               print "FALSE gesetzt"
            self.cbEnergieversorgung.Refresh()
4 Leerzeichen sind für Python-Programmierer Standard! Ich hätte mich jetzt fast vertan. :?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ensacom

Vielen Dank.
Ich glaube ich habe durch dein Beispiel nun auch den Fehler gefunden.
Hinter dem True steht noch ein \n.

Muss ich das also erst mal entfernen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

ensacom hat geschrieben:Hinter dem True steht noch ein \n.
Hallo ensacom!

Und das funktioniert so: ``energie.rstrip()``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
ensacom

ja ich habe es so gemacht

Code: Alles auswählen

datum=string.strip(line[0][1], '\n')
anstat

Code: Alles auswählen

datum=line[0][1]
Ist das so in Ordnung?
BlackJack

@ensacom: Damit habe ich Dir gezeigt, wie man aus der Zeichenkette 'True' einen entsprechenden Wahrheitswert bekommt. Deutlicher als es an einem praktischen Beispiel zu demonstrieren geht's doch nun wirklich nicht mehr. :roll:

Das ``if``/``else`` kann man sich dann auch sparen:

Code: Alles auswählen

            self.cbEnergieversorgung.SetValue(energie == 'True')
Funktionen aus `string`, die es auch als Methoden auf Zeichenketten gibt, sollte man nicht mehr verwenden.
Antworten