GTK-Von/Bis-Datumsauswahl mit Rückgabe an STDOUT

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Es wird mal wieder Zeit, ein kleines Codestückchen von mir zu veröffentlichen. :D

Bild

datetimeselect2.py Zeigt eine Dialogbox an, in der man Von- und Biszeitpunkte auswählen kann. Von- und Biszeitpunkte können auch über die Kommandozeile übergeben werden. Wird nichts übergeben, dann wird der heutige Tag angezeigt. Die Auswahl wird mit `print` an die Standardausgabe (STDOUT) zurück gegeben.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
******************************************************************************
* Description:  Zeigt eine Dialogbox an, in der man Von- und Biszeitpunkte
*               auswählen kann. Von- und Biszeitpunkte können auch über
*               die Kommandozeile übergeben werden. Wird nichts übergeben,
*               dann wird der heutige Tag angezeigt.
* Created:      2005-08-11 by http://halvar.at/
******************************************************************************
"""

import pygtk
pygtk.require("2.0")
import gtk
import time
import datetime
import os.path


#----------------------------------------------------------------------
class Datetimeselect2(object):


    #----------------------------------------------------------------------
    def get_cancel(self):
        """
        Gibt zurück, ob die Dialogbox abgebrochen wurde
        """
        return not(self.normal_closed)


    #----------------------------------------------------------------------
    def show_from_datetime(self):
        """
        Zeigt den Von-Zeitpunkt an
        """
        
        s = "%s. %s %s %02.i:%02.i:%02.i" % (
            self.from_datetime.day,
            self.monate[self.from_datetime.month - 1],
            self.from_datetime.year,
            self.from_datetime.hour,
            self.from_datetime.minute,
            self.from_datetime.second
        )
        self.from_label.set_text(s)


    #----------------------------------------------------------------------
    def show_to_datetime(self):
        """
        Zeigt den Bis-Zeitpunkt an
        """

        s = "%s. %s %s %02.i:%02.i:%02.i" % (
            self.to_datetime.day,
            self.monate[self.to_datetime.month - 1],
            self.to_datetime.year,
            self.to_datetime.hour,
            self.to_datetime.minute,
            self.to_datetime.second
        )
        self.to_label.set_text(s)


    #----------------------------------------------------------------------
    def update_from_datetime(self, widget = None, data = None):
        """
        Aktualisiert das from_datetime-Objekt
        """
        
        # Wenn beim Füllen --> Abbruch
        if self.data_filling:
            return

        # Daten übernehmen
        d = self.from_cal.get_date()
        self.from_datetime = datetime.datetime(
            d[0],
            d[1] + 1,
            d[2],
            int(self.from_hour.get_value()),
            int(self.from_minute.get_value()),
            int(self.from_second.get_value())
        )
        
        # Anzeigen
        self.show_from_datetime()


    #----------------------------------------------------------------------
    def update_to_datetime(self, widget = None, data = None):
        """
        Aktualisiert das to_datetime-Objekt
        """

        # Wenn beim Füllen --> Abbruch
        if self.data_filling:
            return

        # Daten übernehmen
        d = self.to_cal.get_date()
        self.to_datetime = datetime.datetime(
            d[0],
            d[1] + 1,
            d[2],
            int(self.to_hour.get_value()),
            int(self.to_minute.get_value()),
            int(self.to_second.get_value())
        )
        
        # Anzeigen
        self.show_to_datetime()


    #----------------------------------------------------------------------
    def ok_event(self, widget, data = None):
        self.normal_closed = True
        gtk.main_quit()


    #----------------------------------------------------------------------
    def cancel_event(self, widget, data = None):
        self.normal_closed = False
        gtk.main_quit()


    #----------------------------------------------------------------------
    def __init__(self, from_datetime = None, to_datetime = None):
        """
        Initialisiert und zeigt das Dialogfenster an
        """
        
        # Variablen vorbereiten
        self.normal_closed = False
        self.data_filling = False
        self.monate = [
            u"Jänner",
            "Februar",
            u"März",
            "April",
            "Mai",
            "Juni",
            "Juli",
            "August",
            "September",
            "Oktober",
            "November",
            "Dezember"
        ]

        # Daten übernehmen
        if from_datetime:
            self.from_datetime = from_datetime
        else:
            loct = time.localtime()
            self.from_datetime = datetime.datetime(
                loct[0], loct[1], loct[2], 0, 0, 0
            )

        if to_datetime:
            self.to_datetime = to_datetime
        else:
            loct = time.localtime()
            self.to_datetime = datetime.datetime(
                loct[0], loct[1], loct[2], 23, 59, 59
            )

        # Fenster
        w = gtk.Window(gtk.WINDOW_TOPLEVEL)
        w.set_title("Von/Bis Auswahl")
        w.set_modal(True)
        w.set_position(gtk.WIN_POS_CENTER)
        w.set_resizable(False)
        w.connect("destroy", gtk.main_quit)

        # Box
        box1 = gtk.VBox(False, False)
        w.add(box1)
        box1.show()

        # Menü - Menüleiste
        menu_bar = gtk.MenuBar()
        box1.pack_start(menu_bar, False, False)
        menu_bar.show()

        # Menü - Datei-Item
        file_item = gtk.MenuItem("_Datei")
        menu_bar.append(file_item)
        file_item.mnemonic_activate(True)
        file_item.show()

        # Menü - Datei-Menü
        file_menu = gtk.Menu()
        file_item.set_submenu(file_menu)

        # Menü - OK
        ok_item = gtk.ImageMenuItem(gtk.STOCK_OK)
        ok_item.connect("activate", self.ok_event)
        file_menu.append(ok_item)
        ok_item.show()

        # Label
        box2 = gtk.HBox(False, 0)
        box1.pack_start(box2, True, True)
        box2.set_border_width(10)
        box2.show()
        labeltext = \
            u"Wählen Sie links den Beginnzeitpunkt und rechts " + \
            u"den Endzeitpunkt aus. Klicken Sie auf die " + \
            u"<i>OK-Schaltfläche</i> um die Eingabe zu bestätigen."
        label = gtk.Label(labeltext)
        label.set_line_wrap(True)
        label.set_use_markup(True)
        box2.pack_start(label, True, False)
        label.show()

        # Box mit den zwei Seiten
        box2 = gtk.HBox(True, 4)
        box1.pack_start(box2, False, False)
        box2.show()

        # Linke Seite
        #------------------------------------
        box3 = gtk.VBox(False, 4)
        box2.pack_start(box3, False, False, 6)
        box3.show()

        # Label
        label = gtk.Label("Von:")
        label.set_alignment(0.02, 0.0)
        box3.pack_start(label, False, False, 0)
        label.show()

        # Calender - Von
        self.from_cal = gtk.Calendar()
        self.from_cal.set_size_request(200, -1)
        self.from_cal.connect("day-selected", self.update_from_datetime)
        box3.pack_start(self.from_cal, False, False, 0)
        self.from_cal.show()

        # Zeit - Von - Box
        box4 = gtk.HBox(True, 4)
        box3.pack_start(box4, False, False, 0)
        box4.show()

        # Zeit - Von - Stunde
        self.from_hour = gtk.SpinButton()
        self.from_hour.connect("value-changed", self.update_from_datetime)
        adj = self.from_hour.get_adjustment()
        self.data_filling = True
        adj.set_all(0, 0, 23, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.from_hour, True, True, 0)
        self.from_hour.show()

        # Zeit - Von - Minute
        self.from_minute = gtk.SpinButton()
        self.from_minute.connect("value-changed", self.update_from_datetime)
        adj = self.from_minute.get_adjustment()
        self.data_filling = True
        adj.set_all(0, 0, 59, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.from_minute, True, True, 0)
        self.from_minute.show()

        # Zeit - Von - Sekunde
        self.from_second = gtk.SpinButton()
        self.from_second.connect("value-changed", self.update_from_datetime)
        adj = self.from_second.get_adjustment()
        self.data_filling = True
        adj.set_all(0, 0, 59, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.from_second, True, True, 0)
        self.from_second.show()

        # Anzeige - Von
        box4 = gtk.HBox(False, 0)
        box3.pack_start(box4, False, False, 4)
        box4.show()
        self.from_label = gtk.Label()
        box4.pack_start(self.from_label, True, True)
        self.from_label.show()

        # Rechte Seite
        #------------------------------------
        box3 = gtk.VBox(False, 4)
        box2.pack_start(box3, False, False, 6)
        box3.show()

        # Label
        label = gtk.Label("Bis:")
        label.set_alignment(0.02, 0.0)
        box3.pack_start(label, False, False, 0)
        label.show()

        # Calender - Bis
        self.to_cal = gtk.Calendar()
        self.to_cal.set_size_request(200, -1)
        self.to_cal.connect("day-selected", self.update_to_datetime)
        box3.pack_start(self.to_cal, False, False, 0)
        self.to_cal.show()

        # Zeit - Bis - Box
        box4 = gtk.HBox(True, 4)
        box3.pack_start(box4, False, False, 0)
        box4.show()

        # Zeit - Bis - Stunde
        self.to_hour = gtk.SpinButton()
        self.to_hour.connect("value-changed", self.update_to_datetime)
        adj = self.to_hour.get_adjustment()
        self.data_filling = True
        adj.set_all(23, 0, 23, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.to_hour, True, True, 0)
        self.to_hour.show()

        # Zeit - Bis - Minute
        self.to_minute = gtk.SpinButton()
        self.to_minute.connect("value-changed", self.update_to_datetime)
        adj = self.to_minute.get_adjustment()
        self.data_filling = True
        adj.set_all(59, 0, 59, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.to_minute, True, True, 0)
        self.to_minute.show()

        # Zeit - Bis - Sekunde
        self.to_second = gtk.SpinButton()
        self.to_second.connect("value-changed", self.update_to_datetime)
        adj = self.to_second.get_adjustment()
        self.data_filling = True
        adj.set_all(59, 0, 59, 1, 1, 1)
        self.data_filling = False
        box4.pack_start(self.to_second, True, True, 0)
        self.to_second.show()

        # Anzeige - Bis
        box4 = gtk.HBox(False, 0)
        box3.pack_start(box4, False, False, 4)
        box4.show()
        self.to_label = gtk.Label()
        box4.pack_start(self.to_label, True, True)
        self.to_label.show()

        # HSeparator
        #------------------------------------
        box2 = gtk.HBox(False, 0)
        box1.pack_start(box2, False, False, 4)
        box2.show()
        sep = gtk.HSeparator()
        box2.pack_start(sep, True, True)
        sep.show()

        # Abbrechen und OK
        box2 = gtk.HBox(True, 6)
        box1.pack_start(box2, False, False, 6)
        box2.show()
        cancel = gtk.Button(stock = gtk.STOCK_CANCEL)
        cancel.connect("clicked", self.cancel_event)
        box2.pack_start(cancel, True, True, 6)
        cancel.show()
        ok = gtk.Button(stock = gtk.STOCK_OK)
        ok.connect("clicked", self.ok_event)
        box2.pack_start(ok, True, True, 6)
        ok.show()
        ok.set_flags(gtk.CAN_DEFAULT)
        ok.grab_default()
        
        # Datum und Zeit an die Widgets übergeben
        # Flag
        self.data_filling = True
        # From:
        self.from_cal.select_month( 
            self.from_datetime.month - 1, self.from_datetime.year
        )
        self.from_cal.select_day(self.from_datetime.day)
        self.from_hour.set_value(self.from_datetime.hour)
        self.from_minute.set_value(self.from_datetime.minute)
        self.from_second.set_value(self.from_datetime.second)
        # To:
        self.to_cal.select_month(
            self.to_datetime.month - 1, self.to_datetime.year
        )
        self.to_cal.select_day(self.to_datetime.day)
        self.to_hour.set_value(self.to_datetime.hour)
        self.to_minute.set_value(self.to_datetime.minute)
        self.to_second.set_value(self.to_datetime.second)
        # Flag
        self.data_filling = False
        
        # Daten anzeigen
        self.show_from_datetime()
        self.show_to_datetime()
        
        # Fenster anzeigen
        w.show()


#----------------------------------------------------------------------
def parse_options():
    """
    Wertet die Argumente aus und gibt diese zurück
    """

    from optparse import OptionParser
    from sys import exit

    # Usage-Text angeben und Parser-Objekt erzeugen
    usage = \
        "%prog [--from=YYYYMMDD[hhmmss]] [--to=YYYYMMDD[hhmmss]] [-d]\n\n" + \
        "    Zeigt eine Dialogbox an, in der man Von- und Biszeitpunkte\n" + \
        "    auswaehlen kann. Von- und Biszeitpunkte koennen auch ueber\n" + \
        "    die Kommandozeile uebergeben werden. Wird nichts uebergeben,\n" + \
        "    dann wird der heutige Tag angezeigt.\n" + \
        "    By Gerold Penz 2005 -- http://halvar.at/\n\n" + \
        "Beispiel: %prog --from=20050809 --to=20050809"
    parser = OptionParser(usage = usage)

    # Optionen hinzufuegen
    parser.add_option(
        "--from",
        dest = "from_string",
        action = "store",
        metavar = "YYYYMMDDhhmmss",
        default = "",
        help = \
            "YYYYMMDDhhmmss gibt die Schreibweise des Von-Zeitpunkts an"
    )
    parser.add_option(
        "--to",
        dest = "to_string",
        action = "store",
        metavar = "YYYYMMDDhhmmss",
        default = "",
        help = \
            "YYYYMMDDhhmmss gibt die Schreibweise des Bis-Zeitpunkts an"
    )
    parser.add_option(
        "-d", "--debug",
        dest = "debug",
        action = "store_true",
        default = False,
        help = "show debug messages"
    )

    # Optionen parsen
    (options, args) = parser.parse_args()

    # Optionen und Argumente anzeigen
    if options.debug:
        print "Options:"
        print options
        print "-"*70
        print "Arguments:"
        for item in args:
            print item
            print "-"*70

    # Rueckgabe
    return (options, args)


#----------------------------------------------------------------------
if __name__ == "__main__":

    # Optionen und Argumente parsen
    (options, args) = parse_options()

    # Datum parsen
    if options.from_string:
        try:
            from_datetime = datetime.datetime(
                *time.strptime(options.from_string, "%Y%m%d%H%M%S")[:6]
            )
        except:
            from_datetime = datetime.datetime(
                *time.strptime(options.from_string, "%Y%m%d")[:6]
            )
    else:
        loct = time.localtime()
        from_datetime = datetime.datetime(
            loct[0], loct[1], loct[2], 0, 0, 0
        )

    if options.to_string:
        try:
            to_datetime = datetime.datetime(
                *time.strptime(options.to_string, "%Y%m%d%H%M%S")[:6]
            )
        except:
            loct = time.strptime(options.to_string, "%Y%m%d")[:6]
            to_datetime = datetime.datetime(
                loct[0], loct[1], loct[2], 23, 59, 59
            )
    else:
        loct = time.localtime()
        to_datetime = datetime.datetime(
            loct[0], loct[1], loct[2], 23, 59, 59
        )

    # Aufrufen
    diag = Datetimeselect2(from_datetime, to_datetime)
    gtk.main()

    # Zurück geben
    if diag.get_cancel():
        print "cancel"
    else:
        print diag.from_datetime, diag.to_datetime
Hier kann man den Quellcode auch herunterladen: http://gerold.bcom.at/python/python_cod ... t2.py/view

Mit dem Aufruf python datetimeselect2.py -h kommt man zur Hilfe.

lg
Gerold
:-)
Zuletzt geändert von gerold am Mittwoch 17. September 2008, 21:58, insgesamt 2-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

beantwortet
TUFKAB – the user formerly known as blackbird
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

blackbird hat geschrieben:beantwortet
:?: Was meinst du?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Leonidas hat geschrieben:
blackbird hat geschrieben:beantwortet
:?: Was meinst du?
[OT]das[/OT]
TUFKAB – the user formerly known as blackbird
Antworten