Bild einfügen

Fragen zu Tkinter.
nobody
User
Beiträge: 7
Registriert: Donnerstag 14. April 2005, 09:01
Kontaktdaten:

Hallo,ich versuche jetzt schon länger ein Bild einzufügen und zwar mit folgendem Script:

PhotoImage(file='www.gif')
Was mache ich falsch, fehlt etwas?

Dankefür eure Hilfe,das macht mich wahnsinnig^^
nobody is perfect^^
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Code: Alles auswählen

from Tkinter import *
root = Tk()
c = Canvas(root, width="2c",height="2c")
c.pack()
bild = PhotoImage(file=r"/home/sabba/in/mr_snede-calvin.gif")
c.create_image(0, 0, anchor=NW, image=bild)
root.mainloop()
Das Beispiel ist aus "Python GE-PACKT" Seite 420

cu Sebastian

EDIT by mawe: Code in Python-Tags gesetzt. Sieht einfach besser aus
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Prinzipiell musst Du das PhotoImage erst auf ein Widget packen, damit Du es siehst :wink: Mr_Snede hat ja schon ein Beispiel mit einem Canvas gezeigt. Du kannst auch Buttons oder Labels nehmen:

Code: Alles auswählen

Button(image=bild)
Label(image=bild)
Gruß, mawe
nobody
User
Beiträge: 7
Registriert: Donnerstag 14. April 2005, 09:01
Kontaktdaten:

Erstmal danke, aber das klappt irgendwie überhaupt nicht bei mir. Das Bild soll in die Startseite, Über den Button Starten. Ich schaff das irgendwie nicht, bitte leider nochmals um Hilfe;

Code: Alles auswählen

#!/usr/bin/python 
# -*- coding: cp1252 -*-

IN_IDLE = 0

import sys 
from Tkinter import * 

class HauptFenster: 

    def __init__(self): 
        self.root=Tk()
        self.root.title("Quiz")
        self.b_1=Button(self.root,text="starten",command=quiz) 
        self.b_1.pack()

        Label(image='unbenannt.gif') 



class quiz: 


    def __init__(self): 

        self.root=Tk() 
          
        self.root.title("Quiz") 

        self.choice=StringVar() 

        self.database=DataBase('localhost','irgendwer','einedatenbank','einetabelle','ein....') 
        
        self.cols_names=["1","2","3","4"] 

         # Spaltennamen, der aktuellen Tabelle werden ermittelt 
         
                

# TEXT?? FRAGEN?? ## 
        
        #entsprechend den ermittelten Namen wird das SF dynamisch aufgebaut 

      
        for i in range(len(self.cols_names)): 
            self.rb=Radiobutton(self.root,text=self.cols_names[i], 
                        value=self.cols_names[i], 
                        variable=self.choice) 
            self.rb.grid(row=i+2,column=1) 

            

        self.b_1=Button(self.root,text="antworten",command=self.get_selected) 
        self.b_1.grid(row=i+1,column=0) 
        
        self.root.mainloop() 


    def get_selected(self): 
        choice=self.choice.get() 
        print choice 
        # Funktion zum Testen was ausgegeben wird. 
        # Wie oben beschrieben Ergebnis nur, wenn es alleine verwendet wird. 

        
if __name__=="__main__":
        hf=HauptFenster() 
Edit (Leonidas): Wie Mr_Snede schon suggerierte, Code in Python Tags gesetzt.
nobody is perfect^^
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Bitte setze Deinen Quellcode in (Python)Code Tags.
Einfach quote durch: python bzw: /python in den eckigen Klammern ersetzen. (ich bin wie du an meinen vorigen Post siehst auch schon drüber gestolpert ;-)
Dann bleibt die Einrückung erhalten.

Wenn du Fehlermeldungen bekommst, ist es hilfreich diese auch zu posten.

cu Sebastian
nobody
User
Beiträge: 7
Registriert: Donnerstag 14. April 2005, 09:01
Kontaktdaten:

erstmal danke für das einrücken, werde es mir merken, hier die Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "\test.py", line 77, in ?
    hf=HauptFenster()
  File "\test.py", line 17, in __init__
    c = Canvas(root, width="2c",height="2c")
NameError: global name 'root' is not defined
leider sagt mir ausser den Zeilen nix, habe in den Zeilen nen bisel rum experimentiert konnte aber nix finden.
nobody is perfect^^
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dein Programm kann die Variable root nicht erreichen. Du musst die Variable irgendwie der Funktion übergeben die das Canvas erstellt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi nobody!

Naja, in Deinem Traceback steht eine Fehlermeldung mit einem Canvas, in Deinem Code kommt aber kein Canvas vor :shock:
Hast wahrscheinlich vergessen zu posten, jedenfalls gehört statt root einfach self.root rein (vermute ich mal).

Code: Alles auswählen

Label(image="unbenannt.gif")
Na so nicht. Du musst schon zuerst ein PhotImage erstellen, das kannst Du dann so einbinden:

Code: Alles auswählen

bild = PhotImage(file="unbenannt.gif")
Label(image=bild)
Noch was zu Deinem Code: Tk() aus einer Tk-Anwendung heraus aufzurufen ist nicht sehr ratsam. Bestes Beispiel ist idle (=Tk-Anwendung). Wenn Du in idle Tk aufrufst, kommen manchmal die seltsamsten Sachen zustande :wink:
Verwende für die Klasse quiz lieber ein Toplevel.

Gruß, mawe
nobody
User
Beiträge: 7
Registriert: Donnerstag 14. April 2005, 09:01
Kontaktdaten:

Nochmals vielen Dank an euch, jetzt habe ich mal den letzten Code von mawe eingebaut und bekam folgende Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 75, in ?
    hf=HauptFenster()
  File "test.py", line 17, in __init__
    bild = PhotImage(file="www.gif")
NameError: global name 'PhotImage' is not defined
Jetzt habe ich mal ne Frage: wieso ist "PhotoImage" nicht definiert?! Müsste doch eigentlich bei Python 2.4.1 klappen!! Und warum zur Hölle ist es so schwer ein Bild einzubinden???

Danke mal wieder im Vorraus^^
n0b0dy
Zuletzt geändert von nobody am Sonntag 24. April 2005, 08:10, insgesamt 1-mal geändert.
nobody is perfect^^
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi nobody!
nobody hat geschrieben: bild = PhotImage(file="www.gif")
NameError: global name 'PhotImage' is not defined
PhotoImage ist schon definiert, aber PhotImage nicht :)

Und so schwer ist ein Bild einfügen auch nicht: Du erzeugst ein PhotoImage und packst es auf ein Widget. Das wars. :wink:

Gruß, mawe
Zuletzt geändert von mawe am Sonntag 24. April 2005, 06:43, insgesamt 1-mal geändert.
Gast

@ nobody

hi,

:D freut mich ja, dass einiges an code von mir in deine anwendung gefunden hat. oder zufall?
oder der shiraz ist heute zu stark, :D

lg

rolgal
nobody
User
Beiträge: 7
Registriert: Donnerstag 14. April 2005, 09:01
Kontaktdaten:

Ich glaube das schiesst für mich jetzt den Vogel ab. Jetzt kommt keine Fehlermeldung mehr, sondern das TK inter Fenster öffnet sich so, ohne Bild. Wenn ich dann auf starten gehe kommt dann der Error und weiter funzt der nicht. Ich habe zwar versucht mich einzulesen in dieses Thema, aber die Begriffe widget und cavas sagen mir nix, unter google finde ich nur Onlineshop :D könnt mir das mal kurzeiner erklären, oder mir nen Link zu nen entsprechenden Kurs gebeb?

thx
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "test.py", line 33, in __init__
self.database=DataBase('localhost','irgendwer','einedatenbank','einetabelle','ein....')
NameError: global name 'DataBase' is not defined
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "test.py", line 33, in __init__
self.database=DataBase('localhost','irgendwer','einedatenbank','einetabelle','ein....')
NameError: global name 'DataBase' is not defined

daskommt jetzt als Error, nach den Klick auf starten, da war vorher nix, hat alles gefunzt.
nobody is perfect^^
Gast

hi 8)

naja, es gibt DataBase eben nicht.

wenn man code übernimmt muss man eben immer schauen, was man davon braucht und was nicht.

DataBase ist ein modul, das du erst importieren musst.

mfg

rolgal
Gast

kann mir vielleicht jemand helfen
ich will jpeg-bilder einfügen
PhotoImage geht aber nur mit gifs
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Hatten wir schon mal, Du brauchst PIL:

Code: Alles auswählen

from Tkinter import *
from PIL import Image, ImageTk

root = Tk()
image = Image.open('homer.jpg')
photo = ImageTk.PhotoImage(image)
Label(image=photo).pack()
root.mainloop()
Gruß, mawe
Gast

ich hab das jetzt mal versucht, aber bei mir gibts kein PIL modul
Python 2.4 Windows XP Home
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Dann hast Du 2 Möglichkeiten:
1. Du machst nichts und bist traurig.
2. Du installierst dir PIL ganz einfach und freust Dich.

Deine Entscheidung :)

Gruß, mawe
Pü-Ton
User
Beiträge: 67
Registriert: Donnerstag 8. Mai 2008, 07:52

Hallo, der Thread ist zwar schon älter, aber immernoch aktuell.

Ich habe jetzt beide Möglichkeiten, also einmal mit .gif und einmal mit.jpg, ausprobiert und es erscheint jedesmal ein leerer Rahmen, ohne Bild/gif drin.
Ich kann diesen Rahmen in Größe und Position verändern aber ohne Inhalt. Was mach ich falsch???

Hier der Code für den Hauptrahmen:

Code: Alles auswählen


roots = Frame(root, padx=120, pady=105)
roots.config(background="#990000")
roots.grid(row=0,column=0,sticky=N+E+S+W)
roots.master.title("...")
Code für jpg

Code: Alles auswählen

    image = Image.open('logo schwarz.jpg')
    photo = ImageTk.PhotoImage(image)
    Label(roots, width="5c", height="1c", image=photo).grid(sticky=W, pady=15)
Alternativ, hier der Code für gif:

Code: Alles auswählen

    c = Canvas(roots, width="5c", height="1c") # c = Leinwand, mit Logo drin
    c.grid(sticky=W, pady=15)
    bild = PhotoImage(file=r"C:\Documents and Settings\Desktop\logo schwarz.gif") #Pfadangabe des Logos
    c.create_image(0, 0, image=bild)
BlackJack

Du musst auf Python-Seite eine Referenz auf Bilder halten, die in Tk verwendet werden. Sonst wird der Speicher wieder frei gegeben und Tk zeigt nichts an.
Antworten