Изображение не отображается при обновлении/изменении файла Tkinter

У меня есть изображение, которое я разместил, и оно отлично работает, но когда я хочу изменить его на другое изображение, оно не меняется. Изображения карт имеют те же названия, что и в списке, т. е. 2C = 2 треф.

root=Toplevel()
root.state('zoomed')
root.config(bg='#1b800b')
root.title('PokerChamp')


all_cards  = ['2C','3C','4C','5C','6C','7C','8C','9C','10C','JC','QC','KC','AC','2D','3D','4D','5D','6D','7D','8D','9D','10D','JD','QD','KD','AD','2S','3S','4S','5S','6S','7S','8S','9S','10S','JS','QS','KS','AS','2H','3H','4H','5H','6H','7H','8H','9H','10H','JH','QH','KH','AH']

play_card1 = PhotoImage(file='files/cards/red_back.png')
card6 = Label(root, image=play_card1, bd=0)
card6.place_forget()
select_cards()

def select_cards():
    card6.place(relx=0.45, rely=0.75)
    player_card1 = random.choice(all_cards)
    play_card1 = PhotoImage(file = f'files/cards/{player_card1}.png')
    root.update()

person Sam H    schedule 14.05.2020    source источник


Ответы (1)


Когда вы загружаете первое изображение, вы даете ему имя play_card1 в глобальном пространстве имен.

Функция select_cards() является локальным пространством имен, и когда вы присваиваете значение player_card1, это локальное имя, не связанное с меткой, которое будет удалено после завершения функции.

Обычный способ сделать это - присвоить новое изображение метке, а затем сохранить ссылку на изображение в объекте метки, чтобы ссылка на изображение не была потеряна при выходе из функции. Посмотрите мой пример (я использовал немного другие изображения, чем вы...):

from tkinter import *
import random

root = Toplevel()
root.config(bg='#1b800b')
root.title('PokerChamp')

all_cards  = ['chapman','cleese','gilliam','idle','jones','palin']

play_card1 = PhotoImage(file='images/beer.png')
card6 = Label(root, image=play_card1, bd=0)
card6.place_forget()

def select_cards():
    card6.place(relx=0.5, rely=0.5, anchor='center')
    player_card1 = random.choice(all_cards)
    play_card1 = PhotoImage(file = f'images/{player_card1}.png')
    card6.config(image=play_card1)  # Assign new image to label card6
    card6.image = play_card1        # Keep a reference to image
    root.update()

select_cards()

Также я бы посоветовал не использовать имя root для окна Toplevel(), так как root обычно используется для корневого окна.

person figbeam    schedule 14.05.2020