Использование цикла для уменьшения кода и удаления изображений с помощью tkinter - PullRequest
1 голос
/ 22 марта 2019

Для каждого выигрышного предмета я хотел бы отобразить соответствующее изображение в графическом интерфейсе.На данный момент я пишу кучу кода, показанного в операторах if для достижения этой цели.Я уверен, что могу использовать какой-то цикл, чтобы уменьшить количество кода, но пока не уверен, как мне этого добиться.

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

chance_of_drop = random.randint(1,100)
if chance >= chance_of_drop:
    winner = np.random.choice(Items, p=probabilities)
    drop['text'] = "You've recieved a drop: " + winner

    if winner == Items[0]:
        Loot_IMG = PhotoImage(file=Images[0])
        reward_img = Label(GUI, image = Loot_IMG, background = bg_color)
        reward_img.Loot_IMG = Loot_IMG #
        reward_img.grid(row = 3, column=1, sticky = N)
    elif winner == Items[1]:
        Loot_IMG = PhotoImage(file=Images[1])
        reward_img = Label(GUI, image = Loot_IMG, background = bg_color)
        reward_img.Loot_IMG = Loot_IMG #
        reward_img.grid(row = 3, column=1, sticky = N)
    elif winner == Items[2]:
        Loot_IMG = PhotoImage(file=Images[2])
        reward_img = Label(GUI, image = Loot_IMG, background = bg_color)
        reward_img.Loot_IMG = Loot_IMG #
        reward_img.grid(row = 3, column=1, sticky = N)
   # AND SO ON.....


#print("You've recieved a drop:", winner)

else:
    luck['text'] = "You are unlucky"

    #REMOVING IMAGE DOES NOT WORK
    Loot_IMG = PhotoImage(file="")
    reward_img = Label(GUI, image = Loot_IMG, background = bg_color)
    reward_img.Loot_IMG = Loot_IMG #
    reward_img.grid(row = 3, column=1, sticky = N)

ТАКЖЕ я предоставлю оба списка, которые я построил далее в функции:

    Images = ["loot/Dexterous_prayer_scroll.png", "loot/Arcane_prayer_scroll.png",
      "loot/Twisted_buckler.png", "loot/Dragon_hunter_crossbow.png",
      "loot/Dinh's_bulwark.png", "loot/Ancestral_hat.png", "loot/Ancestral_robe_top.png",
      "loot/Ancestral_robe_bottom.png", "loot/Dragon_claws.png", "loot/Elder_maul.png",
      "loot/Kodai_insignia.png", "loot/Twisted_bow.png"]


# indivdual drop rates
Items = ["Dexterous prayer scroll", "Arcane prayer scroll",
         "Twisted buckler", "Dragon hunter crossbow",
         "Dinh's bulwark", "Ancestral hat", "Ancestral robe top",
         "Ancestral robe bottom", "Dragon claws",
         "Elder maul", "Kodai insignia", "Twisted bow"]

1 Ответ

0 голосов
/ 22 марта 2019

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

if chance >= chance_of_drop:
    winner = np.random.choice(Items, p=probabilities)
    drop['text'] = "You've recieved a drop: " + winner

    for item, image in zip(Items, Images):
        if winner == item:
            Loot_IMG = PhotoImage(file=image)
            reward_img = Label(GUI, image=Loot_IMG, background=bg_color)
            reward_img.Loot_IMG = Loot_IMG #
            reward_img.grid(row=3, column=1, sticky=N)
            break
else:
    try:
        reward_img.destroy()  # Remove any existing Label.
    except NameError:
        pass  # Doesn't exist, ignore.

Также обратите внимание, что класс tkinter PhotoImageподдерживает только изображения в формате .gif, .pgm или .ppm.Чтобы загрузить .png изображения, вам нужно использовать класс ImageTk.PhotoImage подмодуля Python Imaging Library (PIL).

Обновление до примечания :

Tk 8.6 добавлена ​​встроенная поддержка формата файлов изображений .png, поэтому вам может не понадобиться использовать PIL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...