Import von Fotos

Fragen zu Tkinter.
Antworten
zwergenaufstand
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 11:43

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!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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).
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
zwergenaufstand
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 11:43

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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?
zwergenaufstand
User
Beiträge: 10
Registriert: Samstag 9. Januar 2010, 11:43

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Antworten