Seite 1 von 1

Import von Fotos

Verfasst: Samstag 9. Januar 2010, 12:25
von zwergenaufstand
Hallo Pythom-Forum,

bin neu hier und auch ein ziemlicher Newbie in Python. Ich habe folgendes Problem: ich will für die Realisierung einer GUI Fotos importieren. Unser Dozent hat dazu einfach

self.photoxyz=PhotoImage(file="xyz.gif")

verwendet. Aber hier zu Hause auf meinem Rechner funzt das nicht. Ansich ja auch kein Wunder, es wird ja überhaupt kein Pfad angegeben. Allerdings hat die genaue Angabe eines Pfades auch nicht geholfen. Hat Python einen bestimmten Default-Folder aus dem es solche Elemente autamatisch ziehen will oder wie geht das?

danke für jede hilfe!

Re: Import von Fotos

Verfasst: Samstag 9. Januar 2010, 12:30
von numerix
PhotoImage ist ein Tkinter-Klasse - hast du Tkinter importiert? Gibt es überhaupt eine entsprechende GUI?

Tipp: Code-Schnipsel posten und die Fehlermeldung (falls es eine gibt).

Verfasst: Samstag 9. Januar 2010, 12:30
von snafu
In solchen Fällen kann man meistens davon ausgehen, dass der aktuelle Pfad genommen wird, wenn nichts weiter angegeben ist. Wichtiger ist doch, wo `PhotoImage` herkommt, oder hast du das drauf?

Verfasst: Samstag 9. Januar 2010, 13:11
von zwergenaufstand
Hey! Danke erstmal für eure Antworten.

@numerix: Ja, die Mutterklasse TkInter ist gleich zu Beginn importiert worden! ;)

@snafu:

Code: Alles auswählen

class Taschenrechner0(Frame):
   newtext="" 
   sum=0
   def __init__(self,master=None):
      
      Frame.__init__(self, master)
      self.option_add('*Font', 'Courier 18 bold') 
      self.fenster=root
      self.canvas = Canvas(self.fenster, width=1024, height=800) 
      self.hintergrund = PhotoImage(file="po-taschenrechner-blau-hintergrund-v1.gif") 
      self.canvas.create_image(0, 0, image=self.hintergrund, anchor=NW) 
      self.canvas.place(x=2,y=2) 

.......

      self.photo0enter=PhotoImage(file="poTaschButton0over.gif")
      self.photo0init=PhotoImage(file="poTaschButton0default.gif")
      self.photo0leave=PhotoImage(file="poTaschButton0default.gif")
      self.photo0pressed=PhotoImage(file="poTaschButton0pressed.gif")
      self.photo0released=PhotoImage(file="poTaschButton0over.gif")

So sieht der Rechner bisher aus...Seh ich das richtig, oder ist die Klasse PhotoImage nirgends initialisiert worden?

Edit (BlackJack): Quelltext in code-Tags gesetzt.

Verfasst: Samstag 9. Januar 2010, 13:50
von numerix
Also, es ist kein PhotoImage-Problem, sondern ein konzeptionelles Problem, denn so, wie du es gemacht hast, ist es nicht gut gelungen.

Ein paar Aspekte:
- Code künftig in Code-Tags setzen und als Python-Code kennzeichnen
- Tkinter nicht mittels Sternchen importieren
- Taschenrechner0 (warum die Null?) eher Taschenrechner nennen und nicht von Frame ableiten; natürlich geht das, aber logisch passt das nicht.
- Wozu die Klassenvariablen (newtext und sum)? Darauf eher verzichten. Auf den Bezeichner sum sowieso, weil es eine built-in-Funktion gleichen Namens gibt, die du damit überschattest.
- root scheint ein globaler Bezeichner zu sein - der hat in dieser Form in der Methodendefinition nichts zu suchen. Wenn du darauf zugreifen musst (was hier aber gar nicht nötig ist), dann übergib ihn als Parameter.
- wenn Canvas ein Teil des Frames sein soll, dann ist Canvas kein Kind von root, sondern vom Frame selbst, also von self; root wird also überhaupt nicht gebraucht
- der place()-Manager ist ein Verbrechen; vergiss, dass es ihn gibt und verwende den pack-Manager oder - z.B. für die Taschenrechner-Tastatur - den grid-Manager.
- Wenn du wirklich die ganzen PhotoImages brauchst, dann verwalte sie z.B. in einem Dictionary und verwende nicht einen Haufen einzelner Bezeichner
- Das Mischen von dt. und englischen Bezeichnernamen ist hässlich

Könnte jemand den Thread ins Tkinter-Subforum verschieben?

Verfasst: Sonntag 10. Januar 2010, 11:20
von zwergenaufstand
Mit all dem hast du wahrscheinlich Recht! Nur bin ich wie gesagt ein Anfänger und mein derzeitiges Problem (nämlich externe Fotos zu importieren) lässt sich durch diese Hinweise leider nicht lösen...Zumindest verstehe ich nicht, weshalb der Import nicht funktioniert.

Verfasst: Sonntag 10. Januar 2010, 11:39
von numerix
zwergenaufstand hat geschrieben:Mit all dem hast du wahrscheinlich Recht! Nur bin ich wie gesagt ein Anfänger und mein derzeitiges Problem (nämlich externe Fotos zu importieren) lässt sich durch diese Hinweise leider nicht lösen...Zumindest verstehe ich nicht, weshalb der Import nicht funktioniert.
Was ist denn dein Ziel? Willst du anständig programmieren lernen mit der mittelfristigen Aussicht, dass du mit Freude an der Sache erfolgreich aus eigener Kraft Programme entwickeln kannst? Oder willst du einfach irgendwie was zusammenfrickeln, aus Codeschnipseln anderer zusammengebastelt, die Hälfte nicht verstanden, aber "Hauptsache es läuft"?

Es ist in obigem Code fast nichts zu ändern, damit letztgenanntes zutrifft - die Verwendung von PhotoImage ist nicht falsch. Ich zumindest möchte aber nicht dazu beitragen, dass du die Lauffähigkeit des so geänderten Codes dann als Erfolg (egal ob als meinen oder deinen) verbuchst, weil es nämlich keiner ist. Denn auch wenn es läuft: Es ist einfach schlecht gemacht! Also: Nimm dir Zeit und arbeite dich zunächst einmal durch ein Tkinter-Tutorial durch (z.B. das hier: http://infohost.nmt.edu/tcc/help/pubs/tkinter/) und geh die Sache dann nochmal neu an.

Anständig zu programmieren lernt man nicht von heute auf morgen. Das ist mit Arbeit verbunden ...

Verfasst: Montag 11. Januar 2010, 10:41
von wuf
Hallo zwergenaufstand

Willkommen in unserem Forum.

Kannst du das folgende Skript einmal ausprobieren?:

Code: Alles auswählen

import Tkinter as tk

class Taschenrechner0(tk.Frame):

    newtext = ""
    sum = 0

    def __init__(self,master=None):

        tk.Frame.__init__(self, master)
        self.pack(expand='yes')

        self.hintergrund = tk.PhotoImage(
            file="po-taschenrechner-blau-hintergrund-v1.gif")

        self.canvas = tk.Canvas(self, width=1024, height=800)
        self.canvas.pack()

        self.canvas.create_image(0, 0, image=self.hintergrund, anchor=tk.NW)

        #self.photo0enter = tk.PhotoImage(file="poTaschButton0over.gif")
        #self.photo0init = tk.PhotoImage(file="poTaschButton0default.gif")
        #self.photo0leave = tk.PhotoImage(file="poTaschButton0default.gif")
        #self.photo0pressed = tk.PhotoImage(file="poTaschButton0pressed.gif")
        #self.photo0released = tk.PhotoImage(file="poTaschButton0over.gif")

fenster = tk.Tk()

taschenrechner = Taschenrechner0(fenster)

fenster.mainloop()
Die Datei "po-taschenrechner-blau-hintergrund-v1.gif" für das Hintergrundbild würde ich vorläufig im gleichen Verzeichnis wie dein Pythonskript ablegen.

Gruss wuf :wink: