[gelöst] Event-Problem

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

Hallo Miteinander,

ich habe ein kleines Problem mit events, im u.g. Programm (bereits auf das Wesentliche gekürzt) wird über
self.comboboxSorte
eine Holzsorte ausgewählt, dabei wird in
self.choice_klasse
die Liste der verfügbaren Holzklassen geändert. Wenn ich dann in
self.comboboxKLED
eine Auswahl treffe, wird durch diesen Event auch die Wahl davor geändert (was aber nicht sein soll..) ich habe versucht mit verschiedenen event-Namen (event1 usw) das Problem zu lösen, geht aber nicht. Leider stehe ich gehörig auf dem Schlauch und brauche Eure Hilfe:

(falls die Erklärung zu spartanisch ist, bitte melden, dann erläutere ich das etwas genauer)

Code: Alles auswählen

# -*- coding: iso-8859-15 -*- 

from __future__ import division
import wx

wx.SetDefaultPyEncoding("iso-8859-15") 

    
class LeftPanel(wx.Panel): 
    
    def __init__(self, parent): 
        wx.Panel.__init__(self, parent,style=wx.TAB_TRAVERSAL | wx.BORDER_RAISED)  
        self.SetBackgroundColour(wx.Colour(240,240,240))
 
        
        
        """Es wird der Gridbagsizer erzeugt, in den die Entrys platziert werden"""
        box=wx.BoxSizer()
        gbs = self.gbs = wx.GridBagSizer(1, 10)
        box.Add(gbs, 0, wx.ALL, 10)
        self.SetSizerAndFit(box)
        
        """Es werden die Entrys erzeugt, sowie deren Bezeichnungen"""  
        
        self.cbSorte=('Nadelholz NH', 'Laubholz LH', 'Brettschichtholz BSH')
        gbs.Add(wx.StaticText(self, -1, 'Holzsorte'),(0,0), (1,3), wx.ALIGN_LEFT | wx.ALL, 5)
        gbs.Add(wx.StaticText(self, -1, 'Sorte:'),(1,0),(1,1),wx.ALIGN_RIGHT | wx.ALL, 5) 

        # This ComboBox is created with a preset list of values.
        self.comboboxSorte = wx.ComboBox(self, 500, 'Nadelholz NH', wx.DefaultPosition, 
                         (150, -1), self.cbSorte,
                         wx.CB_DROPDOWN)
        gbs.Add(self.comboboxSorte, (1,1),(1,2) )

        
        self.Festigkeitsklasse=['C14','C16','C18','C20','C22','C24','C27','C30','C35','C40','C45','C50']
        self.text10=wx.StaticText(self, -1, 'Festigkeitsklasse')
        gbs.Add(self.text10,(0,3), (1,3), wx.ALIGN_LEFT | wx.ALL, 5)
        self.text11=wx.StaticText(self, -1, 'Klasse:')
        gbs.Add(self.text11,(1,3),(1,1),wx.ALIGN_RIGHT | wx.ALL, 5) 

        # This Choice is created with a preset list of values. #self.reihengroesse[0]
        self.choice_klasse = wx.Choice(self, -1,(80, -1), choices =self.Festigkeitsklasse)
        gbs.Add(self.choice_klasse, (1,4),(1,2) )   

            
        cbKLED=('ständig (länger als 10 Jahre)', 'lang (6 Monate bis 10 Jahre)', 'mittel (1 Woche bis 6 Monate)','kurz. (kürzer als eine Woche)','sehr kurz (kürzer als eine Minute)')
        gbs.Add(wx.StaticText(self, -1, 'Klassen der Lasteinwirkungsdauer (KLED):'),(8,0), (1,3), wx.ALIGN_LEFT | wx.ALL, 5)
        gbs.Add(wx.StaticText(self, -1, 'KLED:'),(9,0),(1,1),wx.ALIGN_RIGHT | wx.ALL, 5) 

        # This ComboBox is created with a preset list of values.
        self.comboboxKLED = wx.ComboBox(self, 500, 'mittel (1 Woche bis 6 Monate)', wx.DefaultPosition, 
                         (260, -1), cbKLED,
                         wx.CB_DROPDOWN)
        gbs.Add(self.comboboxKLED, (9,1),(1,6) )
        
        
        self.calcbtn = wx.Button(self, -1, u'Berechnung',size=(200,35) )
        gbs.Add(self.calcbtn, (11,0),(1,6) )

       
ID_TC = wx.NewId()

class holz(wx.Frame): 
    
    def __init__(self, parent = None,id=-1, title = "Materialkennwerte für Holz", size = wx.Size(900, 700)): 
        wx.Frame.__init__(self, parent,id, title, size = size)
        
        #MainPanel
        main_panel = wx.Panel(self,-1)         
        vbox = wx.BoxSizer(wx.VERTICAL) 
        main_panel.SetSizer(vbox)
        box2=wx.BoxSizer(wx.HORIZONTAL)


        # EingabePanel
        self.left_panel=LeftPanel(main_panel)
        box2.Add(self.left_panel, 2, wx.EXPAND)
        
        self.left_panel.Bind(wx.EVT_COMBOBOX, self.EvtComboBoxSorte, self.left_panel.comboboxSorte)
        self.left_panel.Bind(wx.EVT_CHOICE, self.EvtChoiceKlasse,self.left_panel.choice_klasse) 
        self.left_panel.Bind(wx.EVT_COMBOBOX, self.EvtComboBoxKLED, self.left_panel.comboboxKLED)
        self.left_panel.Bind(wx.EVT_BUTTON,self.onCalc, self.left_panel.calcbtn)
        
        self.comboboxSorte_select=0
        self.comboboxKLED_select=2
        
        vbox.Add(box2,1,wx.EXPAND)
        self.Show()
        
    def EvtComboBoxSorte(self, event1):
        self.comboboxSorte_select=event1.GetSelection()
        # Fensteraufbau sperren
        self.Freeze() 
        
        FkNH=['C14','C16','C18','C20','C22','C24','C27','C30','C35','C40','C45','C50']
        FkLH=['D30','D35','D40','D50','D60','D70']
        FkBSH=['GL24h','GL24c','GL28h','GL28c','GL32h','GL32c','GL36h','GL36c']
        
        if self.comboboxSorte_select==0:
            self.left_panel.Festigkeitsklasse=FkNH
        elif self.comboboxSorte_select==1:
            self.left_panel.Festigkeitsklasse=FkLH
        else:
            self.left_panel.Festigkeitsklasse=FkBSH
            
        self.left_panel.choice_klasse.Clear()#self.left_panel.reihengroesse)
        self.left_panel.choice_klasse.AppendItems(self.left_panel.Festigkeitsklasse)
        
        # Fensteraufbau entsperren 
        self.Thaw()
        self.left_panel.gbs.Layout() 
        
        #event1.Skip()
        
    def EvtChoiceKlasse(self, event1):
        self.choice_selected_klasse=event1.GetString()        
        print self.choice_selected_klasse
        event1.Skip()


    def EvtComboBoxKLED(self, event2):
        self.comboboxKLED_select=event2.GetSelection()
        print self.comboboxKLED_select
        event2.Skip()

    def onCalc(self,event):
                 
        Sorte = self.left_panel.cbSorte[self.comboboxSorte_select]
        Fk=self.choice_selected_klasse
        i = self.left_panel.Festigkeitsklasse.index(self.choice_selected_klasse)
            
        self.holz=Sorte+' '+Fk
        print self.holz
            

def main(): 
    """Main""" 
    app = wx.App() 
    f = holz() 
    f.Center() 
    f.Show() 
    app.MainLoop() 

if __name__ == "__main__": 
    main()
Zuletzt geändert von mathi am Dienstag 13. Januar 2009, 14:09, insgesamt 1-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Ändere mal die Binds in

Code: Alles auswählen

        self.left_panel.comboboxSorte.Bind(wx.EVT_COMBOBOX, self.EvtComboBoxSorte)
        self.left_panel.comboboxKLED.Bind(wx.EVT_COMBOBOX, self.EvtComboBoxKLED)
MfG
HWK
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Hallo Mathi,

du kannst es so machen wie HWK vorgeschlagen hat oder du entfernst die Skip() aufrufe in deinen Event-Handlern.

Wenn du nämlich die Skip Methode aufrufst werden alle Handler Funktionen, die an dieses Event gebunden sind aufgerufen. In deinem Fall wird wenn du bei KLED was auswählst nicht nur die Methode EvtComboBoxKLED aufgerufen, sondern auch EvtComboBoxSorte und in dieser Methode löscht du ja auch den Inhalt aus der Combobox.

Mfg
Martin
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

Vielen Dank an Euch beide,

nachdem ich die Binds gem. HWK geändert habe, konnte ich auch die Skip() aufrufe löschen, denn bis dahin war Skip() für das ändern des Choice notwendig.


Vielen Dank nochmal für die Hilfe :-)
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

kurzer Nachbrenner:

ich möchte in der Gruppe der Radiobuttons eine Vorauswahl treffen, doch weder im net noch in wxpython in Action finde ich dazu entspr. Hinweise. Wie kann ich es schaffen??

ein :

Code: Alles auswählen

self.radio1.SetValue(True)


hat leider keinen Effekt :-(
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

So sollte es aber funktionieren. Kannst Du einmal etwas mehr Code zeigen?
MfG
HWK
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

mmmmppffffhhh


nachdem es so funktionieren sollte, hae ich nochmal gesucht, und im Code:

Code: Alles auswählen

for radio in self.group1_ctrls:
    radio.SetValue(False)
gefunden: :oops:

danke für den Hinweis..... :-)
Mathi
Antworten