DatePickerCtrl und das Häkchen oder leeres Datum

Plattformunabhängige GUIs mit wxWidgets.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

DatePickerCtrl und das Häkchen oder leeres Datum

Beitragvon JR » Freitag 24. November 2006, 17:25

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 24. November 2006, 19:38

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
JR
User
Beiträge: 286
Registriert: Montag 20. Februar 2006, 16:43
Wohnort: Berlin

Beitragvon JR » Montag 27. November 2006, 19:58

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
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Montag 27. November 2006, 21:22

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 27. November 2006, 22:30

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Montag 27. November 2006, 23:34

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 28. November 2006, 08:45

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Dienstag 28. November 2006, 13:21

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 28. November 2006, 13:45

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=]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[/code]
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=]>>>
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
>>> [/code]
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Dienstag 28. November 2006, 14:25

[code=]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[/code]
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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Beitragvon sea-live » Donnerstag 13. März 2008, 21:13

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
       
 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder