Tkinter Hintergrundbild

Fragen zu Tkinter.
Antworten
Foxi300
User
Beiträge: 18
Registriert: Samstag 21. Januar 2012, 10:30

Hallo Leute,

wie kann ich in Tkinter ein Hintergrundbild einfügen, welches den ganzen Hintergrund bedeckt?
Die Buttons und Labels sollen natürlich darüber sein ;-)

Schonmal vielen Dank im Voraus und viele Grüße,
Foxi300
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Foxi300

Hier ein bisschen Code:

Code: Alles auswählen

import Tkinter as tk

app_win = tk.Tk()

back_gnd = tk.Canvas(app_win)
back_gnd.pack(expand=True, fill='both')

back_gnd_image = tk.PhotoImage(file="image.gif")
back_gnd.create_image(0, 0, anchor='nw', image=back_gnd_image)

button = tk.Button(None, text="Button", bd=1, highlightthickness=0)
back_gnd.create_window(20,20, window=button, anchor='nw')

app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
problembär

Hmm, ein farbloses Canvas ist eine interessante Idee.
Und dann ein Button mit Parent "None"? Das ist schon ungewöhnlich.

Kann insgesamt aber ziemlich schick aussehen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Problembär

Bild
problembär hat geschrieben:Hmm, ein farbloses Canvas ist eine interessante Idee.
Bei mir ist es nicht farblos.
problembär hat geschrieben:Und dann ein Button mit Parent "None"? Das ist schon ungewöhnlich.
Für mich nicht. Was würdest du dann an Stelle von None verwenden?
problembär hat geschrieben:Kann insgesamt aber ziemlich schick aussehen.
Bei mir sieht es hübsch aus.

OS ist allerdings Linux & Python2.6

Gruß wuf :wink:
Take it easy Mates!
problembär

wuf hat geschrieben:Hi Problembär
problembär hat geschrieben:Hmm, ein farbloses Canvas ist eine interessante Idee.
Bei mir ist es nicht farblos.
Ich meinte, bei einem Canvas setzt man sonst ja eher "fg = 'black', bg = 'white'", weil man darauf etwas zeichnen möchte. Man kann's natürlich auch in der allgemeinen Farbe des Hauptfensters belassen.
wuf hat geschrieben:
problembär hat geschrieben:Und dann ein Button mit Parent "None"? Das ist schon ungewöhnlich.
Für mich nicht. Was würdest du dann an Stelle von None verwenden?
Sonst haben Widgets ja ein übergeordnetes Widget, im Zweifel das Hauptfenster (die tk.Tk()-Instanz). "master = None" ist hier wohl eine Besonderheit von "Canvas.create_window()". Hatte ich halt bisher noch nicht benutzt.
wuf hat geschrieben:
problembär hat geschrieben:Kann insgesamt aber ziemlich schick aussehen.
Bei mir sieht es hübsch aus.

OS ist allerdings Linux & Python2.6
Na ja, mit Linux & Python 2.4 bin ich davon auch nicht so weit weg. ;)

Gruß
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

problembär hat geschrieben:Sonst haben Widgets ja ein übergeordnetes Widget, im Zweifel das Hauptfenster (die tk.Tk()-Instanz). "master = None" ist hier wohl eine Besonderheit von "Canvas.create_window()". Hatte ich halt bisher noch nicht benutzt.
Deine Vermutung ist völlig richtig. Das mit dem 'None' als Ersatz für den master funktioniert nur wenn die Canvas dem Hauptfenster zugeordnet wurde. Sobald die Canvas einer Toplevel-Instanz zugeordnet wurde klemmt es mit dem 'None'. Da muss dem Button-Widget explizit die Referenz der Toplevel-Instanz als übergeordneter Master bekannt gegeben werden.

Hier das Snippet, welches eine Exception wirft:

Code: Alles auswählen

import Tkinter as tk

app_win = tk.Tk()
app_win.title('Back-Image')

back_gnd = tk.Canvas(app_win)
back_gnd.pack(expand=True, fill='both')

back_gnd_image = tk.PhotoImage(file="image.gif")
back_gnd.create_image(0, 0, anchor='nw', image=back_gnd_image)

button = tk.Button(None, text="Button", bd=1, highlightthickness=0)
back_gnd.create_window(20,20, window=button, anchor='nw')

top_level = tk.Toplevel()
canvas_top = tk.Canvas(top_level)
canvas_top.pack()

button_top = tk.Button(None, text="Button", bd=1, highlightthickness=0)
canvas_top.create_window(20,20, window=button_top, anchor='nw')

app_win.mainloop()
Hier das Snippet ohne Exception-Wurf:

Code: Alles auswählen

import Tkinter as tk

app_win = tk.Tk()
app_win.title('Back-Image')

back_gnd = tk.Canvas(app_win)
back_gnd.pack(expand=True, fill='both')

back_gnd_image = tk.PhotoImage(file="image.gif")
back_gnd.create_image(0, 0, anchor='nw', image=back_gnd_image)

button = tk.Button(None, text="Button", bd=1, highlightthickness=0)
back_gnd.create_window(20,20, window=button, anchor='nw')

top_level = tk.Toplevel()
canvas_top = tk.Canvas(top_level)
canvas_top.pack()

button_top = tk.Button(top_level, text="Button", bd=1, highlightthickness=0)
canvas_top.create_window(20,20, window=button_top, anchor='nw')

app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Funktioniert auch unter Windows, danke! 8)
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Foxi300
User
Beiträge: 18
Registriert: Samstag 21. Januar 2012, 10:30

Danke :D
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Hallo,
als ich diesen Thread gelesen habe wurde ich neugierig. Mir ist es nicht möglich, da einen Button darauf anzeigen zu lassen. ich habe ein Skript in Python 3 geschrieben, dass mir ein Hintergrund Bild anzeigt, aber die Buttons werden mir nicht angezeigt... Weiß wer warum? hier wäre der Code:

Code: Alles auswählen

from tkinter import *
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import messagebox



APP_TITLE = "JPEG-Hintergrund"

app_win = tk.Tk()
app_win.title(APP_TITLE)

pil_background_image = Image.open("talion.jpg")
app_win.tk_background_image = ImageTk.PhotoImage(pil_background_image)

width = app_win.tk_background_image.width()
height = app_win.tk_background_image.height()

canvas = tk.Canvas(app_win, width=width, height=height, highlightthickness=0)
canvas.pack()

canvas.create_image(0, 0, image=app_win.tk_background_image, anchor='nw', tag="Hintertgrund")


def Test():
    messagebox.showinfo(message="Test!")

button = Button(app_win, text="Testen!", command=Test, height = 1, width = 12)
button.pack(side = LEFT)
button.config(background='white', foreground='white')


app_win.mainloop()
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Erstens ist dieser Thread von 2012. Da noch Antworten zu erwarten ist ... zuversichtlich.

Und zweitens hast du den exakt gleichen Code schon in einem anderen Thread gepostet. Glaubst du, dass du deine Chancen eher erhoest, wenn du die gleiche Frage mehrfach stellst? Wenn ja, warum dann schon bei zwei stoppen? Das kann man auch 20-mal fragen....
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

__deets__ hat geschrieben: Freitag 18. Mai 2018, 15:36 Erstens ist dieser Thread von 2012. Da noch Antworten zu erwarten ist ... zuversichtlich.
wow... man sieht, es antwortet jemand, somit war mein Ansatz ja nicht völlig falsch!
Und zweitens hast du den exakt gleichen Code schon in einem anderen Thread gepostet. Glaubst du, dass du deine Chancen eher erhoest, wenn du die gleiche Frage mehrfach stellst? Wenn ja, warum dann schon bei zwei stoppen? Das kann man auch 20-mal fragen....
Und ja, meiner Meinung nach schon! Aber jetzt hat sich jemand auf dem ersten gemeldet, dann kann ich ja bei zwei aufhören....
(oder ich mach weiter, nur um dich zu triggern :D )
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na dann, viel Erfolg mit deiner Strategie. Viel hilft ja bekanntlich viel, auch beim auf die Nerven gehen von Leuten, von denen man sich Hilfe erwartet.
Antworten