Info-Dialog mit Bild in Tkinter

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Zur Darstellung der Infodialogbox meiner Programme mit einem Bild von mir verwende ich folgendes Modul:

Code: Alles auswählen

#!/usr/local/bin/python
# File: About.py
# Ausgabe einer About-Dialogbox mit verschiedenen Optionen
# Geschrieben von Hans-Werner Krause, 03/2006 in Python
# msg = Text
# title = Titel der Dialogbox
# image = Bild als String, JPG- oder GIF-Datei

from Tkinter import *
import tkSimpleDialog

class AboutDialog(tkSimpleDialog.Dialog):
    def __init__(self, master, msg, title=None, image=None):
        self.msg=msg
        self.im=None
        if image:
            try:
                if image.lower().endswith('.gif'):
                    self.im=PhotoImage(file=image)
                elif image.startswith('R0lGOD'): # GIF89 Base64-encoded
                    self.im=PhotoImage(data=image)
                else:
                    import Image, ImageTk
                    if image.lower().endswith('.jpg'):
                        self.im=ImageTk.PhotoImage(Image.open(image))
                    else:
                        try:
                            from cStringIO import StringIO
                        except ImportError:
                            from StringIO import StringIO
                        self.im=ImageTk.PhotoImage(Image.open(StringIO\
                                                              (image)))
            except:
                pass
        if title is None:
            title='Info'
        tkSimpleDialog.Dialog.__init__(self, master, title)

    def body(self, master):
        if self.im:
            Label(master, image=self.im, relief=RIDGE).pack(side=LEFT)
        for m in self.msg.split('\n'):
            Label(master, text=m.rstrip()).pack()

    def buttonbox(self):
        box=Frame(self)
        w=Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
        w.pack(side=LEFT, padx=5, pady=5)
        self.bind("<Return>", self.ok)
        box.pack()

if __name__=='__main__':
    import base64
    root=Tk()
    root.title('Info-Dialog-Test')
    AboutDialog(root, 'Dies ist ein Test 1!', 'Info-Dialog', 'hw.jpg')
    AboutDialog(root, 'Dies ist ein Test 2!', 'Info-Dialog', 'hw.gif')
    im=base64.encodestring(open('hw.gif', 'rb').read())
    # Hier würde in Wirklichkeit eine base64-encodierte GIF-Grafik
    # als String im Quellcode stehen
    AboutDialog(root, 'Dies ist ein Test 3!', 'Info-Dialog', im)
    im=open('hw.jpg', 'rb').read()
    # Hier würde eine beliebig codierte JPG-Grafik stehen, die
    # aber vor dem Aufruf der Klasse decodiert werden muss
    AboutDialog(root, 'Dies ist ein Test 4!', 'Info-Dialog', im)
Gibt es Verbesserungsvorschläge?
Antworten