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
wxComboBox und ein Calendar der sich aufklappt
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
Gruss
Christoph
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

Gruss
Christoph
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:
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:
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
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 !

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

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())

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)
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 !
Gut. Hab ich verstandenAnonymous 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.

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()
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()
