Datei öffnen - Datei speichern - Windows Dialog

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:

Samstag 27. August 2005, 18:45

Hi!

Da ich es sowiso als Grundlage für ein Programm von mir brauche, habe ich eine Klasse für den "Windows-Datei-Dialog" erstellt. Vielleicht kann es noch jemand brauchen.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
"""
******************************************************************************
* Description:  Datei-Öffnen/Speichern Dialog von Windows
* Requirements: Python 2.3:  http://www.python.org
*               pywin32:    http://sourceforge.net/projects/pywin32/
******************************************************************************
"""

import win32ui
import win32con


#----------------------------------------------------------------------
class Win32FileDialog(object):
    """
    Windows Datei-Öffnen/Speichern-Dialog
    """

    #----------------------------------------------------------------------
    def __init__(
        self, 
        file_open_dialog = True,
        initial_dir = "",
        initial_file = "",
        def_ext = "", 
        filterstring = "Alle Dateien (*.*)|*.*",
        overwriteprompt = False,
        pathmustexist = True,
        filemustexist = False,
        createprompt = False
    ):
        """
        file_open_dialog: Wenn True, dann wird der Öffnen-Dialog und wenn
                          False, dann wird der "Speichern unter"-Dialog angezeigt.
        initial_dir: Wenn ein gültiger Pfad angegeben wurde, dann wird dieser
                     als Vorgabe verwendet.
        initial_file: Dateiname, der als Vorgabe verwendet werden soll.
        def_ext: Vorgegebene Dateinamenerweiterung. Wenn keine Erweiterung
                 wie z.B. "exe" oder "doc" angegeben wurde, dann wird diese
                 Erweiterung verwendet und an den Dateinamen angehängt.
        filterstring: Eine Filterzeichenfolge könnte z.B. so aussehen.
                      "Einstellungen (*.ini)|*.ini|Alle Dateien (*.*)|*.*"
        overwriteprompt: Wenn True, dann wird eine Meldung ausgegeben, die fragt
                         ob die Datei überschrieben werden soll.
        pathmustexist: Wenn True, dann muss der Ordner existieren.
        filemustexist: Wenn True, dann muss die Datei existieren.
        createprompt: Wenn True, dann wird, wenn die Datei nicht existiert,
                      eine Meldung ausgegeben, die fragt ob die Datei 
                      neu erstellt werden soll.
                      
        """

        # Daten übernehmen
        self.file_open_dialog = file_open_dialog
        self.initial_dir = initial_dir
        self.initial_file = initial_file
        self.def_ext = def_ext
        self.filterstring = filterstring

        # Flags zusammensetzen
        self.flags = win32con.OFN_HIDEREADONLY
        if overwriteprompt:
            self.flags = self.flags | win32con.OFN_OVERWRITEPROMPT
        if pathmustexist:
            self.flags = self.flags | win32con.OFN_PATHMUSTEXIST
        if filemustexist:
            self.flags = self.flags | win32con.OFN_FILEMUSTEXIST
        if createprompt:
            self.flags = self.flags | win32con.OFN_CREATEPROMPT

    
    #----------------------------------------------------------------------
    def show_file_dialog(self):
        """
        Zeigt den Datei-Öffnen/Speichern Dialog an und gibt den ausgewählten
        Dateinamen zurück.
        """

        filedialog = win32ui.CreateFileDialog(
            self.file_open_dialog, #bFileOpen
            self.def_ext, #defExt
            self.initial_file, #fileName
            self.flags, #flags
            self.filterstring #filter
        )

        # Anfangsverzeichnis setzen
        if self.initial_dir:
            filedialog.SetOFNInitialDir(self.initial_dir)
            
        # Dialog anzeigen
        retval = filedialog.DoModal()
        
        # Rückgabe und Exit
        pathname = filedialog.GetPathName()
        filedialog = None 
        if retval == 1:
            return pathname
        else:
            return ""



#----------------------------------------------------------------------
if __name__ == "__main__":
    
    # Öffnen-Dialog testen
    print Win32FileDialog(
        True, 
        initial_dir = "%SystemRoot%",
        initial_file = "win.ini",
        def_ext = "ini",
        filterstring = "INI-Datei (*.ini)|*.ini|Alle Dateien (*.*)|*.*",
        filemustexist = True
    ).show_file_dialog()
    
    # Speichern-Dialog testen
    print Win32FileDialog(
        False, 
        initial_dir = "%SystemRoot%",
        filterstring = "INI-Datei (*.ini)|*.ini|Alle Dateien (*.*)|*.*"
    ).show_file_dialog()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 919
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Sonntag 28. August 2005, 11:28

Hi gerold,
ich hab beim verwenden von deiner Klasse noch ein Problem.
Immer wenn ich das Programm dann laufen lasse öffnet sich zuerst ein Datei speichern Dialog der eine "win.ini" Datei im Windows Verzeichnis speichern will. Und danach ein Datei öffnen Dialog. Und dann erst wird das Script ausgeführt.

Ich denke es liegt an der Installation von pywin32.
Irgendeine Idee was das sein kann?

Gruß
Damaskus

EDIT by DAMA:

Wer lesen kann ist klar im Vorteil... :roll: :roll: :roll:
Ich hab die Testfunktion mit übernommen...

Super Sache der Dialog!
Thx
Antworten