Tkinter, python 3.8.1, win10Pro, как поменять изображение метки? - PullRequest
0 голосов
/ 20 февраля 2020

Это мой ОЧЕНЬ первый пост, так что простите за новизну. Я пытаюсь сделать GUI игры в кости (2 х шестисторонних). Logi c случайных бросков работает нормально, чтобы утешить. Также в консоли я вижу, что число d ie соответствует правильному файлу изображения, но у меня возникают проблемы при замене изображений меток tkinter на новые соответствующие изображения в каждом рулоне после начального запуска.

При запуске корректно отображаются оба изображения d ie, но когда я нажимаю кнопку «Свернуть», оба изображения с первого рулона просто исчезают, а новые изображения рулона не отображаются. Он просто закрывает пространство, ранее занимаемое изображениями первого рулона.

Если присмотреться, я вижу правильные изображения d ie "fla sh" на экране в их правильных положениях, чтобы они сразу исчезали при каждом нажатии кнопки "Roll".

Я не могу прикрепить шесть изображений, которые я использую для возможных бросков d ie (недостаток кредитов), но дело в том, чтобы продемонстрировать способность переключаться с любого изображения на любое другое, так что не стесняйтесь попробовать с любыми 6 гифками.

Я видел похожие вопросы на этом сайте, но когда я попробовал предложенный код или предложенную комбинацию кода, у меня возникла та же проблема, что и сейчас.

Я использую python 3.8.1 на win10pro. Любая помощь будет оценена! Вот мой код:

from tkinter import *
import random

window = Tk()
window.title( 'Roller' )
window.resizable( 0, 0 )

def get_roll():
    min=1
    max=6

    die1 = random.randint(min,max)
    die2 = random.randint(min,max)

    if die1 == die2:
        print(die1,'+',die2,'=',die1+die2, '*** You rolled doubles ***')
    else:    
        print(die1,'+',die2,'=',die1+die2)
    return die1,die2

def get_image(index):
    images = []
    images.append('die_01_42158_sm.gif')
    images.append('die_02_42159_sm.gif')
    images.append('die_03_42160_sm.gif')
    images.append('die_04_42161_sm.gif')
    images.append('die_05_42162_sm.gif')
    images.append('die_06_42164_sm.gif')
    return images[index-1]

def do_roll():
    global window

    die1, die2 = get_roll()

    imgfile1 = get_image(die1)
    imgfile2 = get_image(die2)

    print(imgfile1)
    img1 = PhotoImage( file = imgfile1 )
    #img1 = img1.subsample(20)
    imgLbl1.configure( image = img1 )
    #imgLbl1 = Label( window, image = img1 )
    #imgLbl1.grid(row = 0, column = 0)
    window.update_idletasks()

    print(imgfile2)
    img2 = PhotoImage( file = imgfile2 )
    #img2 = img2.subsample(20)
    imgLbl2.configure( image = img2 )
    #imgLbl2 = Label( window, image = img2 )
    #imgLbl2.grid(row = 0, column = 1)
    window.update_idletasks()

die1, die2 = get_roll()
imgfile1 = get_image(die1)
imgfile2 = get_image(die2)

img1 = PhotoImage( file = imgfile1 )
#img1 = img1.subsample(20)
imgLbl1 = Label( window, image = img1 )
imgLbl1.grid( row = 0, column = 0 )

img2 = PhotoImage( file = imgfile2 )
#img2 = img2.subsample(20)
imgLbl2 = Label( window, image = img2 )
imgLbl2.grid( row = 0, column = 1 )

rollBtn = Button( window )
rollBtn.grid( row = 0, column = 2 )
rollBtn.configure( text = 'Roll' )
rollBtn.configure( command = do_roll )

quitBtn = Button( window )
quitBtn.grid( row = 0, column = 3 )
quitBtn.configure( text = 'Quit' )
quitBtn.configure( command = window.destroy )

#do_roll()

window.mainloop()

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Используя вышеупомянутое решение acw1668, я смог использовать его, чтобы завершить задачу симуляции бросков пары костей. Первоначально, кости go через 10 случайных бросков затем останавливаются на десятых как «бросок». Каждое последующее нажатие кнопки прокрутки вызывает то же самое. Моя желаемая программа c состояла в том, чтобы продемонстрировать, что изображение этикетки можно менять несколько раз. Вот код (но вы должны будете предоставить свои собственные изображения для 6 сторон d ie - извините, не можете загрузить с низкими кредитами):

from tkinter import *
import random

def get_roll():
    min=1
    max=6

    die1 = random.randint(min,max)
    die2 = random.randint(min,max)

    if die1 == die2:
        print(die1,'+',die2,'=',die1+die2, '*** You rolled doubles ***')
    else:    
        print(die1,'+',die2,'=',die1+die2)
    return die1,die2

def get_image(index):
    images = []
    images.append('die_01_42158_sm.gif')
    images.append('die_02_42159_sm.gif')
    images.append('die_03_42160_sm.gif')
    images.append('die_04_42161_sm.gif')
    images.append('die_05_42162_sm.gif')
    images.append('die_06_42164_sm.gif')
    return images[index-1]

counter = 0 
def counter_label():
    global counter
    print('counter_label() counter =', counter)
    def count():
        global counter, imgLbl1, imgLbl2

        print('count() counter =', counter)

        print(counter)
        counter += 1
        if counter > 10:
           return

        die1, die2 = get_roll()

        imgfile1 = get_image(die1)
        imgLbl1.image = PhotoImage( file = imgfile1 )
        imgLbl1.configure( image = imgLbl1.image )

        imgfile2 = get_image(die2)
        imgLbl2.image = PhotoImage( file = imgfile2 )
        imgLbl2.configure( image = imgLbl2.image )

        imgLbl1.after(10, count)

    if counter >= 10:
        counter = 0
    count()

root = Tk()
root.title("Counting Seconds")

imgLbl1 = Label(root)
imgLbl1.pack(side =LEFT)
imgLbl2 = Label(root)
imgLbl2.pack(side =LEFT)

counter_label()

buttonr = Button(root, text='Roll', width=25, command=counter_label)
buttonr.pack()

buttonq = Button(root, text='Stop', width=25, command=root.destroy)
buttonq.pack()

root.mainloop()
0 голосов
/ 20 февраля 2020

Поскольку вы использовали локальные переменные для хранения изображений, они будут собирать мусор после функции.

Вы должны сохранить ссылки на изображения:

def do_roll():
    die1, die2 = get_roll()

    imgfile1 = get_image(die1)
    imgfile2 = get_image(die2)

    print(imgfile1)
    imgLbl1.image = PhotoImage(file=imgfile1)
    imgLbl1.configure(image=imgLbl1.image)

    print(imgfile2)
    imgLbl2.image = PhotoImage(file=imgfile2)
    imgLbl2.configure(image=imgLbl2.image)

Или объявить img1 и img2 как глобальные:

def do_roll():
    global img1, img2

    die1, die2 = get_roll()

    imgfile1 = get_image(die1)
    imgfile2 = get_image(die2)

    print(imgfile1)
    img1 = PhotoImage(file=imgfile1)
    imgLbl1.configure(image=img1)

    print(imgfile2)
    img2 = PhotoImage(file=imgfile2)
    imgLbl2.configure(image=img2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...