wxComboBox und ein Calendar der sich aufklappt

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

Hallo erstmal

Ich habe folgendes Problem und zwar möchte ich wenn man auf den Button oder das Eingabefeld bei einer wxComboBox klickt das dann ein Calenderausklappt, das Calendarfenster hab ich schon geschrieben das ist nicht das problem...
Ich habe es zur zeit mit EVT_SET_FOCUS gemacht das problem ist nur wenn ich dann den Calender wieder verlasse und dann auf den Button klicke das sich dann garnichts tut statt dessen muss ich auf das eingabefeld klicken um den calendar wieder auszuklappen klick ich dann aber wieder auf das eingabe feld tut sich wieder nix dann muss ich nähmlich wieder auf den button klicken... naja ihr versteht sicher schon... und das zweite problem was dann auftritt ist ich habe da so gemacht das wenn man jetzt wo anders in meinem fenster klickt verschwindet der kalendar und dann sollte iegentlich das EVT_KILL_FOCUS aufgerufen werden und das datum sollte in die combobox geschrieben werden das passert aber wiederrum nur dann wenn ich erneut in die Combox klicke... alles sehr komisch...
was ich mir jetzt überlegt habe gibt es eine Möglichkeit den Focus von dem wxComboBox Objekt zu nehmen um das EVT_KILL_FOCUS aufzurufen ? oder sollte ich ein anderes objekt benutzen ? oder wisst ihr den richtigen EVT Methode die ich aufrufen muss ???
danke schonmal im vorraus
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Hallo Sneaker
tut mir leid, aber ich hab gar nix verstanden... :(

Vielleicht kannst Du noch mal kurz und prägnant erläutern:
1. was Du erreichen willst
2. wie hast Du es implementiert (evt. mit Beispielcode)
3. was genau funktioniert nicht

Das ist zwar keine Garantie das Dir jemand helfen kann, aber zumindest erhöht es die Chancen verstanden zu werden :wink:

Gruss
Christoph
Gast

Dann hab ich mich mal wieder umständlich ausgedrückt gut das mich mal jemand drauf hin weisst :)

also ich will erreichen das wenn ich auf ein wxComboBox objekt klicke das sich ein Calendar unter diesem aufklappt, ich das Datum mit einem doppelklick auswählen kann und das sich dann wieder der calendar schlisst und das dieser wert in die comboxbox eingetragen wird.

So kommen wir zum code:

Code: Alles auswählen

class CPopupCalendar(wxPopupTransientWindow):
    date = ''
    
    def __init__(self, parent):
        wxPopupTransientWindow.__init__(self, parent, wxSIMPLE_BORDER | wxNO_3D)
        
        self.cal = wxCalendarCtrl(self, ID_DCLICKDAY, wxDateTime_Now(), pos = (0,0), style = wxCAL_SEQUENTIAL_MONTH_SELECTION)
        EVT_CALENDAR(self, ID_DCLICKDAY, self.OnChoseDate)
        
        sz = self.cal.GetBestSize()
        self.SetSize((sz.width, sz.height))
        
    def OnChoseDate(self, event):
        year = string.split(str(event.GetDate()))[0]
        year = string.split(year, '/')
        self.date = '%s-%s-%s' % (year[1], year[0], year[2])
        
        self.Show(False)
    
    def GetDate(self):
        return self.date
das Format wird in ein year-month-day format meinerseits umgewandelt wer ne python funktion dafür kennt nur her damit :)

die GetDate Methode werde ich vielleicht wieder verwerfen, weil das problem das beim aufruf vom calendar wieder ein neuer thread gestartet wird den ich an dieser stelle nicht gebrauchen kann
der code dazu sieht so aus:

Code: Alles auswählen

def OnComboCalendar(self, event):
        self.calendar = CPopupCalendar(self)
        
        btn = event.GetEventObject()
        pos = btn.ClientToScreen( (0,0) )
        sz =  btn.GetSize()
        self.calendar.Position(pos, (0, sz.height))

        self.calendar.Popup()
        
    def OnSetDate(self, event):
        self.cbdate.SetValue(self.calendar.GetDate())
wenn jemand weiss wie ich es hinkriege das nach dem das popup geschlossen wird ich danne rst die GetDate() methode aufrufen kann, ruhig sagen ;)

und nun das problem mit dem EVT Handler

Code: Alles auswählen

self.cbdate = wxComboBox(self.tb, ID_COMBODATE, self.datelist[0], size=(-1,-1), choices=self.datelist, style = wxCB_DROPDOWN)
self.tb.AddControl(self.cbdate)
EVT_SET_FOCUS(self.cbdate, self.OnComboCalendar)
#EVT_KILL_FOCUS(self.cbdate, self.OnSetDate)
tb ist eine Toolbar in die die combobox eingetragen wird
KILL_FOCUS ist erstmal aus kommentiert bis das eigentliche problem gelöst ist (und ich diese art auch nciht so schön finde weil es damit auch nur probleme gibt ;))

so und nun zu meinem eigendlichen problem:
wenn ich nun die ComboBox auswähle wird ja ein FOCUS event ausgelöst und die OnComboCalender Methode wird aufgerufen. der calendar erscheint alles wunderbar ich wähle einen tag aus... klicke ich nun an genau die gleiche stelle in der combobox noch mal also entweder auf den button oder das eingabefeld dann passiert nix, erst wenn ich ein anderes feld der combobox klicke passiert wieder was... so und nun weiss ich nicht weiter...

und das zweite problem ist halt das eintragen des datums nachdem das datum aus dem calendar ausgegewählt habe, dass erstmal garnix passiert also kein KILL FOCUS event ausgelöst wird und das dieses erst ausgelöst wird nachdem ich erneut in die combobox klicke aber dann dreh ich mich ja im kreis weil dann wieder das SET FOCUS event ausgelöst..........

ich hoffe ihr könnt mir helfen udn mir sagen was ich besser machen kann.

und sollte dies wieder niemand verstanden haben mal nachfragen wie der christropy !
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

Falls ihr es nicht gemerkt habt das hab ich eben gepostet bloss leider hab ich mich vergessen einzuloggen
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

Anonymous aka sneaker hat geschrieben: also ich will erreichen das wenn ich auf ein wxComboBox objekt klicke das sich ein Calendar unter diesem aufklappt, ich das Datum mit einem doppelklick auswählen kann und das sich dann wieder der calendar schlisst und das dieser wert in die comboxbox eingetragen wird.
Gut. Hab ich verstanden :wink:
Hab bis jetzt gar nicht gewusst, das man sowas mit Comboboxen machen kann. Danke!

Aber zum Problem:
Ich würde das folgendermaßen lösen:

Code: Alles auswählen

class CPopupCalendar(wxPopupTransientWindow): 

    def __init__(self, parent): 
        self.parent = parent
        wxPopupTransientWindow.__init__(self, parent, wxSIMPLE_BORDER | wxNO_3D) 
        
        self.cal = wxCalendarCtrl(self, wxNewId(), wxDateTime_Now(), pos = (0,0), style = wxCAL_SEQUENTIAL_MONTH_SELECTION) 
        EVT_CALENDAR(self, self.cal.GetId(), self.OnChoseDate) 
        
        sz = self.cal.GetBestSize() 
        self.SetSize((sz.width, sz.height)) 
        
    def OnChoseDate(self, event): 
        year = string.split(str(event.GetDate()))[0] 
        year = string.split(year, '/') 
        date = '%s-%s-%s' % (year[1], year[0], year[2]) 
        
        self.parent.SetValue( date )
        self.Destroy()
D.h. du zerstörst das CalendarCtrl sofort nach Gebrauch wieder. Vorher schreibst Du aber noch das Datum in die ComboBox. Dieses musst Du vorher aber als Parent übergeben. Ich empfehle eine eigene ComboBox-Klasse zu schreiben. Dort wird dann mit EVT_LEFT_DOWN das CalendarCtrl aufgerufen. Dann kannst Du in der ComboBox das Datum von Hand ändern und mit draufklicken das CalendarCtrl erzeugen.

Code: Alles auswählen

class MyComboBox( wxComboBox ):
    def __init__(self, *args, **kwds):
        wxComboBox.__init__( self, *args, **kwds )
        
        EVT_LEFT_DOWN(self, self.OnComboCalendar)  
        
    def OnComboCalendar( self, event ):
        calendar = CPopupCalendar.CPopupCalendar(self)
        
        btn = event.GetEventObject() 
        pos = btn.ClientToScreen( (0,0) ) 
        sz =  btn.GetSize() 
        calendar.Position(pos, (0, sz.height)) 

        calendar.Popup()
Hoffe ich konnte helfen... :D
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

JIPPI :D
du bist der beste es wörkt wunderbar :)
thx
Antworten