python смена изображения, ткинтер и пил - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь сделать игру под названием Лама или утка, но с кошками и кубиками. Моя проблема в том, что когда я нажимаю на куб, кнопки исчезают, а изображение не меняется.

Вот мой код:

from tkinter import *
import random
from PIL import Image, ImageTk
window=Tk()
window.geometry('500x550')
window.resizable(False, False)
f=tk.Frame()
f.config(bg='blue', height='500', width='500')
f.pack()
def imageelection():
    images=['cat1.jpg', 'cat2.jpg', 'cat3.jpg', 'cube1.jpg', 'cube2.jpg', 'cube3.jpg']
    imageselection=ImageTk.PhotoImage(file=random.choice(images))
    img = Label(f, image=imageselection)
    img.pack()
images=['cat1.jpg', 'cat2.jpg', 'cat3.jpg', 'cube1.jpg', 'cube2.jpg', 'cube3.jpg']
rand=random.choice(images)
imageselection=ImageTk.PhotoImage(file=rand)
img = Label(f, image=imageselection)
img.pack()
def cubeelection():
    if rand=='cube1.jpg':
        imageelection()
    elif rand=='cube2.jpg':
        imageelection()
    elif rand=='cube3.jpg':
        imageelection()
    else:
        print('fail')
        imageelection()
cat=tk.Button(window, text='Cat')
cat.config()
cat.pack(fill=X)
cube=tk.Button(window, text='Cube', command=cubeelection)
cube.config()
cube.pack(fill=X)
window.mainloop()

1 Ответ

1 голос
/ 06 апреля 2020

Кнопки нажаты (вне видимой области) новой меткой, созданной в imageelection(). Изображение, созданное внутри imageelection(), является локальным для него и будет собирать мусор после завершения функции.

Что я понимаю, вам не нужно создавать новую метку внутри imageelection(), просто обновите метку img , Чтобы сохранить изображение после изменения внутри функции, вам нужно объявить imageselection и rand как глобальные переменные:

images=['cat1.jpg', 'cat2.jpg', 'cat3.jpg', 'cube1.jpg', 'cube2.jpg', 'cube3.jpg']

def imageelection():
    global imageselection, rand
    rand = random.choice(images) # select another image
    imageselection = ImageTk.PhotoImage(file=rand)
    img.config(image=imageselection)

rand = random.choice(images)
imageselection = ImageTk.PhotoImage(file=rand)
img = Label(f, image=imageselection)
img.pack()

def cubeelection():
    if rand in ['cube1.jpg', 'cube2.jpg', 'cube3.jpg']:
        print('ok')
    else:
        print('fail')
    imageelection()
...