Bild auf Button

Fragen zu Tkinter.
Antworten
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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()
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

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?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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()  
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Höchste Zeit es zu lernen, denn OOP ist heute nicht mehr weg zudenken.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
laura_lou
User
Beiträge: 7
Registriert: Dienstag 19. Oktober 2010, 13:44

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Die Grundlagen bleiben trotzdem die gleichen. :wink:
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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.
Antworten