python - Why aren't my Tkinter Labels updating? -
it's understanding class diceroller should inheriting class die, every time run error:
self.display.config(text = str(self.value)) attributeerror: 'diceroller' object has no attribute 'display' the value of self.value updating, tkinter label not.
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) 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 in fact changing self.display.config(text = str(self.value)) varname = diceroller()
you
attributeerror: 'diceroller' object has no attribute 'display' error because diceroller doesn't have .display attribute.
you may expect have 1 because die class has .display attribute, attribute gets created when die.__init__ gets called, , diceroller won't automatically call die.__init__ because you've overridden method diceroller's own .__init__ method.
if want call die.__init__ inside diceroller.__init__ can that, suggested way use super function. have careful call die.__init__ correct arguments!
however, there's no need diceroller inherit die. i've moved diceroller's old rolldice method die & created new rolldice method diceroller. when 'roll again' button pressed dice in diceroller.dice rolled.
import tkinter tk import random class die(object): def __init__(self, value, display): self.value = random.randint(1,6) self.display = tk.label(display, text = str(self.value), font = ('garamond', 56), bg = 'white', relief = 'ridge', borderwidth = 5) self.display.pack(side = 'left') def rolldice(self): self.value = random.randint(1,6) print self.value #to show value in fact changing self.display.config(text = str(self.value)) class diceroller(object): def __init__(self): self.gamewin = tk.tk() self.gamewin.title('dice roller') self.gameframe = tk.frame(self.gamewin) self.dice = [] self.row1 = tk.frame(self.gamewin) in range(1,4): self.dice.append(die(i, self.row1)) self.topframe = tk.frame(self.gamewin) self.rollbtn = tk.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): die in self.dice: die.rolldice() diceroller()
Comments
Post a Comment