Python - Dice Roller с использованием Tkinter

Я использую приложение Canopy в компьютерной системе Windows. Я пытаюсь создать веселую и простую игру в кости. Игра работает, однако я не могу успешно добавить изображение кости в качестве кнопки прокрутки. Кажется, я получаю сообщение об ошибке, на котором не могу найти никаких ресурсов. Мне только интересно, внедряю ли я вещи не в то место? Или если код изображения даже не будет работать вообще. Я не хочу, чтобы люди делали это для меня, мне просто нужен простой ответ, если я правильно завершаю это, и мне нужно только кое-что подправить. Спасибо!

Ошибка при компиляции: TclError: изображение "pyimage26" не существует

Текущий постоянный код ниже...

 import random
    import Tkinter
    from PIL import ImageTk, Image
    import os

    win = Tkinter.Tk()
    win.title("Die Roller")
    class die():
        import Tkinter
        def __init__(self,ivalue,parent):
            self.label_var = Tkinter.IntVar()
            self.label_var.set(ivalue)
            self.display = Tkinter.Label(parent,relief='ridge', borderwidth=4, 
                           textvariable=self.label_var)
            self.display.pack(side='left')

    img = ImageTk.PhotoImage(Image.open("meme.jpg"))
    panel =Tkinter.Label(win, image =  img)
    panel.pack(side = "bottom", fill = "both", expand = "yes")
    win.mainloop()
    def roll(self):
            value = random.randint(1,6)
            self.label_var.set(value)
            print "You rolled =  ", value
    def rollin():
        d1.roll()
        d2.roll()
        d3.roll()
    row1 = Tkinter.Frame(win)
    row2 = Tkinter.Frame(win)
    d1 = die(1,row1)
    d2 = die(1,row1)
    d3 = die(1,row1)
    row1.pack()
    rolldice = Tkinter.Button(row2, command=rollin, text = "Roll The Die")
    rolldice.pack()
    row2.pack()
    win.mainloop()

1 ответ

Решение

Я просто переформатировал ваш код так, чтобы прицелы имели какой-то смысл, и придумал:

import random
import Tkinter
from PIL import ImageTk, Image

class die():                                                                 
    def __init__(self,ivalue,parent):                                        
        self.label_var = Tkinter.IntVar()                                    
        self.label_var.set(ivalue)                                           
        self.display = Tkinter.Label(parent,relief='ridge', borderwidth=4,
                                              textvariable=self.label_var)
        self.display.pack(side='left')                                       

    def roll(self):                                                          
            value = random.randint(1,6)                                      
            self.label_var.set(value)                                        
            print "You rolled =  ", value                                    

def rollin():                                                                
    d1.roll()                                                                
    d2.roll()                                                                
    d3.roll()                                                                

if __name__=="__main__":                                                     
    win = Tkinter.Tk()                                                       
    win.title("Die Roller")                                                  
    row1 = Tkinter.Frame(win)                                                
    row2 = Tkinter.Frame(win)                                                
    d1 = die(1,row1)                                                         
    d2 = die(1,row1)                                                         
    d3 = die(1,row1)                                                         
    row1.pack()                                                              
    rolldice = Tkinter.Button(row2, command=rollin, text = "Roll The Die")   
    rolldice.pack()                                                          
    row2.pack()                                                              
    img = ImageTk.PhotoImage(Image.open("meme.jpg"))                     
    panel =Tkinter.Label(win, image =  img)                                  
    panel.pack(side = "bottom", fill = "both", expand = "yes")               
    win.mainloop()

У вас есть некоторые проблемы в вашем коде. Во-первых, вы используете win.mainloop() два раза, что не имеет никакого смысла.

Во-вторых, вы должны убедиться, что ваш объем правильный. Глобальная переменная изображения img внутри кода выше (мой) объявлен внутри глобальной области видимости.

Ваш удаляется за пределами класса. Поэтому он больше не доступен.

Ваш ОС импорт (import os) не используется, поэтому я удалил его.

Всегда не забывайте форматировать код не только для вызова в python, но также поддерживать его в чистоте и использовать функциональные возможности области, заданные языком (например, if __name__=="__main__" конструкции, которые сохраняют глобальный охват.

Другие вопросы по тегам