我的理解是,类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()
答案 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