Python - 使用Tkinter的骰子滚轮

时间:2018-02-07 15:30:41

标签: python tkinter tkinter-canvas

我在Windows计算机系统上使用应用程序Canopy。我正在尝试创建一个有趣而简单的骰子滚动游戏。游戏有效,但我无法成功添加骰子图像作为滚动按钮。我似乎得到一个错误,我无法找到任何资源。我只是想知道如果我把事情搞到了错误的地方?或者如果图像代码甚至无法工作。我不希望别人为我这样做,我只需要一个简单的答案,如果我正确完成这个,我只需要触摸一些东西。 谢谢!

编译提供的错误: TclError:image" 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 个答案:

答案 0 :(得分:0)

我只是重新格式化了你的代码,以便范围有意义并提出:

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__"构造。