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. :P

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