python-3.x - 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()
解决方案
推荐阅读
- java - 使用递归将数组按特定条件分成 2 组
- android - CoordinatorLayout 与 RecyclerView 滚动错误
- algorithm - 与 log(n) 行为混淆
- c# - 访问控制器时发生堆栈溢出
- javascript - 如何从 document.querySelectorAll() 正确循环遍历 NodeList?
- sorting - 猫鼬; 排序,使某个记录首先出现
- python - 几分钟后 SQLAlchemy 会话不断下降
- c# - 将以前的用户猜测添加到属性列表 C# 并从列表中打印属性值
- html - 使 img 和 input 正确排列并在 html 中向右浮动
- java - 如何通过 OrientDB 中的 Graph API(Tinkerpop Blueprints)按边检索顶点?