为什么我的Tkinter标签没有更新?

时间:2016-11-10 17:46:44

标签: python python-2.7 tkinter

我的理解是,类DiceRoller应该继承自类die,但每次运行时我都会收到错误:

self.display.config(text = str(self.value))  
AttributeError: 'DiceRoller' object has no attribute 'display'  

self.value的值正在更新,但Tkinter标签不是。

import Tkinter
import random

class die(object):
    def __init__(self,value,display):
        self.value = random.randint(1,6)
        self.display = Tkinter.Label(display,
          text = str(self.value),
          font = ('Garamond', 56),
          bg = 'white',
          relief = 'ridge',
          borderwidth = 5)
        self.display.pack(side = 'left')

class DiceRoller(die):
    def __init__(self):
        self.gameWin = Tkinter.Tk()
        self.gameWin.title('Dice Roller')
        self.gameFrame = Tkinter.Frame(self.gameWin)
        self.dice = []
        self.Row1 = Tkinter.Frame(self.gameWin)
        for i in range(1,4):
            self.dice.append(die(i,self.Row1))  
        self.topFrame = Tkinter.Frame(self.gameWin)
        self.rollBtn = Tkinter.Button(self.topFrame,
            text = 'Roll Again',
            command = self.rollDice,
            font = ('Garamond', 56))
        self.rollBtn.pack(side = 'bottom')

        self.gameFrame.pack()
        self.Row1.pack()
        self.topFrame.pack()
        self.gameWin.mainloop()
    def rollDice(self):
        self.value = random.randint(1,6)
        print self.value  #to show value is in fact changing
        self.display.config(text = str(self.value))

varName = DiceRoller()

1 个答案:

答案 0 :(得分:1)

你明白了

AttributeError: 'DiceRoller' object has no attribute 'display' 

错误,因为DiceRoller实际上没有.display属性。

由于die类具有.display属性,您可能期望它有一个属性,但在die.__init__被调用时会创建该属性,{ {1}}无法自动致电DiceRoller,因为您已使用die.__init__自己的DiceRoller方法覆盖了该方法。

如果您想在.__init__内拨打die.__init__,可以这样做,建议的方法是使用super功能。但是你必须小心使用正确的参数调用DiceRoller.__init__

但是,die.__init__无需继承DiceRoller。我已将die的旧DiceRoller方法移至rollDice&为die创建了一个新的rollDice方法。因此,当按下DiceRoller按钮时,'Roll Again'中的所有骰子都会被滚动。

DiceRoller.dice