web-dev-qa-db-fra.com

Fond transparent dans une fenêtre Tkinter

Est-il possible de créer un "écran de chargement" dans Python 3.x à l'aide de Tkinter? Je veux dire comme l’écran de chargement pour Adobe Photoshop, avec transparence, etc. J'ai réussi à me débarrasser de la bordure du cadre en utilisant déjà:

root.overrideredirect(1)

Mais si je fais ça:

root.image = PhotoImage(file=pyloc+'\startup.gif')
label = Label(image=root.image)
label.pack()

l'image s'affiche correctement, mais avec l'arrière-plan gris de la fenêtre au lieu de la transparence.

Existe-t-il un moyen d'ajouter de la transparence à une fenêtre tout en affichant correctement l'image?

9
forumfresser

Il n'y a pas de moyen multiplateforme de rendre juste le fond transparent dans tkinter.

3
Bryan Oakley

C'est possible, mais cela dépend du système d'exploitation. Cela fonctionnera sous Windows:

import Tkinter as tk # Python 2
import tkinter as tk # Python 3
root = tk.Tk()
# The image must be stored to Tk or it will be garbage collected.
root.image = tk.PhotoImage(file='startup.gif')
label = tk.Label(root, image=root.image, bg='white')
root.overrideredirect(True)
root.geometry("+250+250")
root.lift()
root.wm_attributes("-topmost", True)
root.wm_attributes("-disabled", True)
root.wm_attributes("-transparentcolor", "white")
label.pack()
label.mainloop()
20
dln385

Voici une solution pour macOS :

import tkinter as tk

root = tk.Tk()
# Hide the root window drag bar and close button
root.overrideredirect(True)
# Make the root window always on top
root.wm_attributes("-topmost", True)
# Turn off the window shadow
root.wm_attributes("-transparent", True)
# Set the root window background color to a transparent color
root.config(bg='systemTransparent')

root.geometry("+300+300")

# Store the PhotoImage to prevent early garbage collection
root.image = tk.PhotoImage(file="photoshop-icon.gif")
# Display the image on a label
label = tk.Label(root, image=root.image)
# Set the label background color to a transparent color
label.config(bg='systemTransparent')
label.pack()

root.mainloop()

 Screenshot

(testé sur macOS Sierra 10.12.21)

4
Josselin

Vous pouvez faire ceci: window.attributes("-transparentcolor", "somecolor")

1
Jakub Bláha