首页 > 解决方案 > Tkinter | 在顶层窗口中插入图像

问题描述

我想在新的顶层窗口标签中显示图像。为此,我使用 PIL 和下面的代码:

victory = Toplevel(fen1) 
Label(victory, text=VICTORY_TEXT).grid(row=1)
img = ImageTk.PhotoImage(Image.open("ampoule.jpeg"))
img_victory = Label(victory, image=img)
img_victory.grid(row=2)

图像存储在与 .py 文件相同的文件夹中。虽然它在带有这个特定图像的主 Tk() 中工作,但是当我运行程序时,这里的图像没有出现,但没有弹出错误。我想不通...

我是 Python 和编码方面的新手。

谢谢你的帮助 !

下面是我的整个代码(基于弹跳球的游戏)。关于图像插入的代码在clic函数定义中:

from tkinter import Tk, Canvas, Button, LEFT, RIGHT, Label, Toplevel
from PIL import ImageTk, Image
# Variables constantes :
x1, y1 = 30, 30     # Position qui sera variable en fonction du mouvement

RBALLE = 20         # Rayon de la balle
Vx = 30     # Vitesse en x (horizontale)
Vy = 0      # Vitesse en y (verticale). Elle sera gérée par la gravité
DT = 0.05    # Variable d'incrément de temps (= vitesse de la simulation)
GRAVITY = 1  # constante de gravitation
# Coefficient de restitution toujours compris entre 0 et 1. Il indique quelle
# sera la perte d'énergie de l'objet.
RESTIT = 1 
FLAG = 0
SCORE = 0   # Variable qui conserve le score de l'utilisateur
COULEURS = ["Green",  "Pink", "Blue", "Orange", "Brown", "Red"]
INDEX_COULEUR = 0
VICTORY_TEXT = """BRAVO ! Tu es une championne ! Est-ce de la chance ?
Une autre partie pour vérifier ?"""


# Définition des fonctions
def mouv_balle():
    "Fonction qui gère le mouvement de la balle"
    global x1, y1, FLAG, Vy, Vx, GRAVITY
    Vy += GRAVITY * DT          # La balle tombe de plus en plus vite
    x1 += Vx * DT               # La vitesse
    y1 += Vy * DT
    if y1 > 500 - RBALLE:       # Si la balle touche le bord du bas
        y1 = 500 - RBALLE       # La balle est repositionnée
        Vy = Vy * -RESTIT       # La vitesse (direction) est inversée
    if y1 < 0 + RBALLE:         # et on applique le coeff de restitution
        y1 = RBALLE
        Vy = Vy * -RESTIT
    if x1 > 500 - RBALLE:
        x1 = 500 - RBALLE
        Vx = Vx * -RESTIT
    if x1 < 0 + RBALLE:
        x1 = RBALLE
        Vx = Vx * -RESTIT
    can1.coords(balle, x1 - RBALLE, y1 - RBALLE, x1 + RBALLE, y1 + RBALLE)
    if FLAG > 0:
        fen1.after(30, mouv_balle)


def lacher_balle():
    "Permet de lacher la balle et de voir les rebonds"
    global FLAG
    if FLAG == 0:
        FLAG = 1
        mouv_balle()
        compteur.configure(text=SCORE)


def remettre_balle():
    "Réinitialise la position de la balle pour un nouveau lacher"
    global FLAG, x1, y1, Vx, Vy, DT, INDEX_COULEUR
    if FLAG == 1:
        FLAG = 0
        x1, y1 = 30, 30     # On remet les coordonnées initiales
        Vx, Vy = 30, 0       # On remet les vitesses initiales
        DT = 0.1            # On remet l'incrément de temps initial 
        INDEX_COULEUR = 0   # La couleur est à nouveau la 1ère (vert)
        can1.itemconfigure(balle, fill=COULEURS[INDEX_COULEUR])
        can1.coords(balle, x1 - RBALLE, y1 - RBALLE, x1 + RBALLE, y1 + RBALLE)
        compteur.configure(text="NEW GAME")


def clic(event):
    """Si l'utilisateur clique sur la balle alors le compteur est incrémenté de 
    1 et DT (vitesse horizontale) est augmentée de moitié"""
    global SCORE, DT, INDEX_COULEUR, FLAG
    if FLAG == 1:
        if SCORE < 5:
            INDEX_COULEUR += 1
            can1.itemconfigure(balle, fill=COULEURS[INDEX_COULEUR])
            SCORE += 1
            compteur.configure(text=SCORE)
            DT += 0.1  # On augmente la vitesse de la balle 
        else:
            victory = Toplevel(fen1) 
            Label(victory, text=VICTORY_TEXT).grid(row=1)
            # Création d'un image
            img = ImageTk.PhotoImage(Image.open("ampoule.jpeg"))
            img_victory = Label(victory, image=img)
            img_victory.grid(row=2)
            remettre_balle()
            SCORE = 0


# ---------Programme principal---------------
# Création de la fenêtre
fen1 = Tk()
fen1.title("Balle rebondissante")
# Création du canevas avec une balle à l'intérieur
can1 = Canvas(fen1, bg="white", width=500, height=500)
can1.pack()
balle = can1.create_oval(
        x1 - RBALLE,
        y1 - RBALLE,
        x1 + RBALLE,
        y1 + RBALLE,
        fill=COULEURS[INDEX_COULEUR]
        )
# Clic gauche sur la balle = fonction clic
can1.tag_bind(balle, "<Button-1>", clic)
# Création d'un bouton pour lacher la balle
bou1 = Button(fen1, text="Lacher balle", command=lacher_balle)
bou1.pack(side=LEFT)
bou2 = Button(fen1, text="Remettre balle", command=remettre_balle)
bou2.pack(side=LEFT)
# Création d'un bouton pour quitter
Button(fen1, text="Quitter", command=fen1.quit).pack(side=RIGHT)
# Création du compteur de point
compteur = Label(fen1, text="NEW GAME", font="Bold")
compteur.pack()

# Initialisation du réceptionnaire d'événements
fen1.mainloop()

标签: python-3.ximagetkinterpython-imaging-library

解决方案


推荐阅读