Seite 1 von 1

Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 18:33
von laura_lou
Hallo!

Also erstmal, hab gesehen, dass es schon einen ähnlichen Thread dafür gibt, aber irgendwie komm ich mir blöd vor:
Im Quelltext steht genau das, womit es funktionieren sollte, aber irgendwas scheint trotzdem nicht zu stimmen... :(

Ich möchte auf einen Button statt Text ein Bild legen, und hab folgendes geschrieben:

Code: Alles auswählen

bild=PhotoImage(file=r'C:\Users\Public\Documents\My Dropbox\imgneu.gif')
bb=Button(master,relief="ridge",bg="#f3e997",image=bild,command=bbc)
bwc=canvas.create_window(777,80,window=bb)
Es kommt keine Fehlermeldung, aber der Button ist leer!
Ich hab schon Verschiedenes probiert; hab die anderen Optionen beim Button weggemacht (relief und bg), hab nicht den gesamten Pfad angegeben (Bild und Programm sind im gleichen Ordner), hab zuerst vor dem Pfad kein r geschrieben und jetzt mit.
Eine andere Möglichkeit hab ich nicht gefunden, das stand so eigentlich in allen Quellen.

Nur in einer Quelle, die sich aber auf eine ältere Version von Python (ich benutze 2.6) bezieht, steht folgendes über Bitmaps:
For bitmap options in widgets, these bitmaps are guaranteed to be available:
The graphic above shows Button widgets bearing the standard bitmaps. From left to right, they are
"error", "gray75", "gray50", "gray25", "gray12", "hourglass", "info", "questhead",
"question", and "warning".
You can use your own bitmaps. Any file in .xbm (X bit map) format will work. In place of a standard
bitmap name, use the string "@" followed by the pathname of the .xbm file.
Und folgendes über Images:
To use graphic images in a Tkinter application, Tkinter must be configured to include the Python Imaging
Library (PIL).
Refer to the author's companion document for PIL documentation: Python Imaging Library (PIL) quick
reference5. Objects of the ImageTk class can be used in Tkinter applications.
(Die Quelle ist "Tkinter reference: a GUI" for Python - John W. Shipman, von Anfang 2008. Geht dabei um Python 2.2. Das PDF-Dokument haben wir in der Schule bekommen und daraus hab ich eigentlich auch fast alles, was ich in Tkinter überhaupt kann...)

Ich hab früher mal das mit den Bitmaps probiert, funktioniert so wie beschrieben auch nicht - da war dann auch der Lehrer ratlos.


Weiß einer von euch, was ich falsch gemacht habe, oder wie man auf eine andere Art ein Bild auf einen Button bekommt?
Danke schonmal! :D

LG, Lou

Re: Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 18:45
von Xynon1
Ich seh da eigentlich keinen Fehler, daher vermute ich das dein Pfad falsch ist.

btw. setze bitte Leerzeichen, wie es in den PEPs empfohlen wird.

Edit: Hier hast du auf jeden Fall noch mal ein eigenständiges script teste es mal.

Code: Alles auswählen

import Tkinter as tkinter

def bbc():
    pass

if __name__ == "__main__":
    root = tkinter.Tk()

    canvas = tkinter.Canvas(root)
    canvas.pack()

    bild = tkinter.PhotoImage(file="C:\Users\Public\Documents\My Dropbox\imgneu.gif")
    bb = tkinter.Button(relief="ridge", bg="#f3e997", image=bild, command=bbc)

    bwc = canvas.create_window(50, 80, window=bb)

    root.mainloop()

Re: Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 18:57
von laura_lou
Hm, danke - hab das mal ausprobiert - funktioniert wunderbar, genau wie es soll. Jetzt bin ich ratlos...

Im eigentlichen Programm ist das in einer def drin, kann das der Grund sein?

Re: Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 19:00
von Xynon1
Ja, durchaus, das hatten wir schon öfters, da das Image verworfen wird sobald die Referenz nicht mehr gehalten wird.
wenn ich das richtig vermute steht das auch in eine Klasse, dann mach mal ein self.bild daraus.

Ansonsten wäre global definieren eine eher unschöne Lösung, oder als Parameter mit übergeben.

Re: Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 19:02
von laura_lou
Ich hatte in derzwischen mal den ersten Teil (bild=PhotoImage( usw) aus der def rausgenommen und direkt unter master=Tk() geschrieben, und jetzt funktioniert es :D

Ich probier nochmal mit self, aber so geht es auf jeden Fall auch.

Danke nochmal =)

LG, Lou

Re: Bild auf Button

Verfasst: Donnerstag 21. Oktober 2010, 19:10
von Xynon1
self. Funktioniert nur in einer Klasse, bei zB.:

Code: Alles auswählen

import Tkinter as tkinter

class App(tkinter.Frame):

    def __init__(self, master):
        tkinter.Frame.__init__(master)    

        self.bild = tkinter.PhotoImage(file="C:\Users\Public\Documents\My Dropbox\imgneu.gif")
        ...
   
if __name__ = "__main__":
    root = tkinter.Tk()
    
    application = App(root)

    root.mainloop()  

Re: Bild auf Button

Verfasst: Freitag 22. Oktober 2010, 10:27
von laura_lou
oh; okay, danke. Mit Klassen (oder Objektorientiertem Programmieren genrell) kenn ich mich eigentlich kaum aus; wir haben das in der Schule so gut wie gar nicht behandelt. :K

Re: Bild auf Button

Verfasst: Freitag 22. Oktober 2010, 10:30
von Xynon1
Höchste Zeit es zu lernen, denn OOP ist heute nicht mehr weg zudenken.

Re: Bild auf Button

Verfasst: Freitag 22. Oktober 2010, 11:59
von laura_lou
Naja, wir fangen demnächst mit Java an, und das ist ja auch objektorientiert. Werd mich dann auch eher darauf konzentrieren, weil wir das dann auch beim Abi nutzen sollen/müssen.

Re: Bild auf Button

Verfasst: Freitag 22. Oktober 2010, 12:04
von Xynon1
Die Grundlagen bleiben trotzdem die gleichen. :wink:

Re: Bild auf Button

Verfasst: Freitag 22. Oktober 2010, 12:47
von BlackJack
Und umgekehrt muss man mit Java nicht unbedingt objektorientierte Programmierung lernen. Alles in Klassen zu stecken ist nicht automatisch OOP. Manchmal hat man da auch Informatiklehrer, die einfach versuchen Pascal in die Syntax von Java zu quetschen.