Seite 1 von 1
DatePickerCtrl und das Häkchen oder leeres Datum
Verfasst: Freitag 24. November 2006, 17:25
von JR
Hallo!
Jetzt habe ich es eine Stunde versucht. Weiß jemand, wie ich bei dem Objekt DatePickerCtrl prozedual das Häkchen setze? Und kann man auch ein leeres Datum setzen?
Ich habe ein Verzeichnis, wo ich u.a. das Geburtsdatum von Leuten anzeige und u.U. bearbeiten lasse. Wenn kein Datum angegeben ist, soll auch kein Wert im Feld stehen.
Hier ist der Code:
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
# File: test.py
import wx
#------------------------------------------------------------------------
class MyFrame(wx.Dialog):
def __init__(self, parent, title):
wx.Dialog.__init__(self, parent, -1, title,
pos=(150, 150), size=(300, 350))
panel = wx.Panel(self, -1)
obj = wx.DatePickerCtrl(parent=panel, style=wx.DP_DEFAULT|wx.DP_DROPDOWN|wx.DP_ALLOWNONE )
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(obj, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALL, 15)
panel.SetSizer(main_sizer)
main_sizer.Fit(self)
self.main_sizer = main_sizer
#------------------------------------------------------------------------
#------------------------------------------------------------------------
class MyApp(wx.App):
def OnInit(self):
dialog = MyFrame(None, 'Titel')
if dialog.ShowModal() == wx.ID_OK:
print dialog.object.GetDate()
return True
app = MyApp(0)
app.MainLoop()
Viele Grüße
Jamil
Verfasst: Freitag 24. November 2006, 19:38
von gerold
Hi Jamil!
Ab Zeile 24:
Code: Alles auswählen
app = wx.PySimpleApp()
dialog = MyFrame(None, 'Titel')
dialog.ShowModal()
wxdt = dialog.obj.GetValue() # (wxdt = wx.DateTime())
is_valid = wxdt.IsValid()
print "IsValid:", is_valid
if is_valid:
print wxdt
lg
Gerold
Verfasst: Montag 27. November 2006, 19:58
von JR
Hi gerold!
Habe irgendwie erst jetzt mehr durch Zufall deine Antwort bemerkt
Vielen Dank jedenfalls.
Sage mal weißt du eine Antwort auf meine Frage
http://www.python-forum.de/topic-7949.h ... ht=cachefu an dich?
Grüße
Jamil
Verfasst: Montag 27. November 2006, 21:22
von HWK
Löst das denn das Problem? Das Häkchen und den Inhalt des Feldes kann man ja weiterhin nicht vom Programm aus verändern. Ich lese ja nur die vom Benutzer eingegebenen Informationen aus.
MfG
HWK
Verfasst: Montag 27. November 2006, 22:30
von gerold
Hi HWK!
Du hast natürlich Recht. Das war nur der Code zum Auslesen. Den zum Setzen habe ich nicht beigesteuert.
Hier der Code, zum Setzen des Wertes -- allerdings bekomme ich einen Fehler bei ``dialog.ShowModal()``, den ich mir nicht so ganz erklären kann. Also weiß ich auch nicht, wie man damit umgehen soll.
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
import wx
import random
class MyFrame(wx.Dialog):
def __init__(self, parent, title):
wx.Dialog.__init__(
self, parent, -1, title, pos = (150, 150), size = (300, 350)
)
panel = wx.Panel(self, -1)
self.obj = wx.DatePickerCtrl(
parent = panel, style = wx.DP_DEFAULT | wx.DP_DROPDOWN | wx.DP_ALLOWNONE
)
invalid_date = wx.DateTime()
good_date = wx.DateTime() # Ungültiges Datum
good_date.Set(24, 12, 2006) # Gültiges Datum
new_date = random.choice((invalid_date, good_date))
self.obj.SetValue(new_date)
self.obj.Validate()
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(self.obj, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.ALL, 15)
panel.SetSizer(main_sizer)
main_sizer.Fit(self)
self.main_sizer = main_sizer
app = wx.PySimpleApp()
dialog = MyFrame(None, 'Titel')
dialog.ShowModal()
wxdt = dialog.obj.GetValue() # (wxdt = wx.DateTime())
is_valid = wxdt.IsValid()
print "IsValid:", is_valid
if is_valid:
print wxdt
mfg
Gerold
Verfasst: Montag 27. November 2006, 23:34
von HWK
Hallo, Gerold!
Ich bekomme keine Fehler. Aber JRs Problem ist doch immer noch nicht gelöst: Man kann das Häkchen nicht setzen und es wird immer ein Datum im Feld angezeigt.
MfG
HWK
Verfasst: Dienstag 28. November 2006, 08:45
von gerold
HWK hat geschrieben:Ich bekomme keine Fehler. Aber JRs Problem ist doch immer noch nicht gelöst
Hi HWK!
1.) Der Fehler taucht dann auf, wenn man zuerst ein gültiges Datum auswählt und dann aber das Häckchen wieder weg nimmt. Beim Schließen tritt dann ein Fehler auf. (zumindest unter Windows XP)
2.) Übergibt man mit ``self.obj.SetValue()`` ein ungesetztes ``wx.DateTime``-Objekt, dann ist das Häckchen nicht gesetzt.
Übergibt man ein mit einem gültigen Datum belegtes ``wx.DateTime``-Objekt, dann ist das Häckchen gesetzt.
Dass auch bei einem nicht gesetzten Häckchen das aktuelle Datum angezeigt wird, dafür kann ich nichts.
Meine persönliche Meinung zum ``DatePickerCtrl`` -- Auf keinen Fall das Flag ``wx.DP_ALLOWNONE`` in einem Dialog verwenden!!! Vielleicht funktioniert es in einem Frame besser. Lieber eines der anderen Datum-Widgets verwenden oder selber eine Klasse dafür machen.
lg
Gerold
Verfasst: Dienstag 28. November 2006, 13:21
von HWK
Ich habe alle möglichen Varianten probiert. Es gelingt mir aber nicht, einen Fehler zu provozieren.
Die Darstellung des Datums habe ich ja auch nicht Dir zum Vorwurf gemacht. Ist wohl einfach nicht anders möglich. Die Frage dazu kam ja von JR.
MfG
HWK
Verfasst: Dienstag 28. November 2006, 13:45
von gerold
HWK hat geschrieben:Es gelingt mir aber nicht, einen Fehler zu provozieren.
Hi HWK!
Code: Alles auswählen
# -*- coding: iso-8859-1 -*-
import wx
import sys
print "Das ist meine Umgebung:"
print "======================="
print "sys.version:", sys.version
print "sys.platform:", sys.platform
try:
print "sys.winver:", sys.winver # --> Windows XP Professional
except:
pass
print "wx.VERSION_STRING:", wx.VERSION_STRING
Code: Alles auswählen
Das ist meine Umgebung:
=======================
sys.version: 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)]
sys.platform: win32
sys.winver: 2.4
wx.VERSION_STRING: 2.7.1.2
Dieser Traceback erscheint, wenn ich das Programm starte, dann ein gültiges Datum auswähle, dann das Häckchen wieder entferne und mit einem Klick auf das X in der Titelleiste, das Programm beende:
Code: Alles auswählen
>>>
Traceback (most recent call last):
File "J:\Dokumente und Einstellungen\Gerold\Desktop\Neuer Ordner\hallo.py", line 36, in ?
dialog.ShowModal()
File "J:\Python24\lib\site-packages\wx-2.7.1-msw-unicode\wx\_windows.py", line 703, in ShowModal
return _windows_.Dialog_ShowModal(*args, **kwargs)
PyAssertionError: C++ assertion "IsValid()" failed at ..\..\include\wx/datetime.h(1658) in wxDateTime::GetValue(): invalid wxDateTime
>>>
Für mich sieht das nach einem Bug aus. Es macht ja keinen Sinn, zu prüfen ob ein gültiges Datum drinnen steht, wenn das Flag ``wx.DP_ALLOWNONE`` gesetzt ist.
lg
Gerold
Verfasst: Dienstag 28. November 2006, 14:25
von HWK
Code: Alles auswählen
Das ist meine Umgebung:
=======================
sys.version: 2.4.2 (#67, Sep 28 2005, 12:41:11) [MSC v.1310 32 bit (Intel)]
sys.platform: win32
sys.winver: 2.4
wx.VERSION_STRING: 2.6.3.2
Wenn ich das Programm starte und z.B. Heiligabend 2006 auswähle, das Häkchen lösche und das Fenster schließe, erscheint kein Fehler. Liegt es evtl. an der anderen wxPython-Version?
MfG
HWK
Verfasst: Donnerstag 13. März 2008, 21:13
von sea-live
und wie bekomme ich das Datum wieder raus aus dem Feld
Code: Alles auswählen
self.von = wx.DatePickerCtrl(self, size=(100,-1),
style=wx.DP_DROPDOWN |wx.DP_ALLOWNONE | wx.DP_SHOWCENTURY)
von_datum = wx.DateTime() # Ungültiges Datum
von_datum.Set(01, 01, 2008) # Gültiges Datum
self.von.SetValue(von_datum)
sizer.Add(self.von)
self.Bind(wx.EVT_DATE_CHANGED, self.OnVonDatum, self.von)
def OnVonDatum(self,event):
self.von_datum=wx.DateTime()
self.von_datum.Set(self.von.GetValue())
print 'datumvon '+ self.von_datum