Python error; 'NoneType' object has no attribute 'after'

Thread Starter

Vindhyachal Takniki

Joined Nov 3, 2014
594
I got error while coding in python.
Need to print same random value again & again.

Code:
from Tkinter import *
import Tkinter
from random import randint

class App1(Tkinter.Tk):
   
    def __init__(self, master):
        Tkinter.Tk.__init__(self,master)
        self.master = master

        self.label = Label(self , text = "Voltage" , font = ("Helvetica",32))
        self.label.grid(row = 0)

        self.reading_label = Label(self,text = '0.0' , font = ("Helvetica",110))
        self.reading_label.grid(row = 1)
        self.update_reading()


    def update_reading(self):
        value = randint(0,9)
        reading_str = "{:.2f}".format(value)
        self.reading_label.configure(text = reading_str)
        self.master.after(1 , self.update_reading)


root = App1(None)
root.title("Option")
root.geometry("320x240")
root.mainloop()

I gor error message:
Traceback (most recent call last):
File "/voltmeter.py", line 26, in <module>
root = App1(None)
File "/voltmeter.py", line 16, in __init__
self.update_reading()
File "/voltmeter.py", line 23, in update_reading
self.master.after(1 , self.update_reading)
AttributeError: 'NoneType' object has no attribute 'after'
 

tjohnson

Joined Dec 23, 2014
611
Here is an abbreviated version of your code:
Python:
class App1(Tkinter.Tk):
    def __init__(self, master):
        Tkinter.Tk.__init__(self,master)
        self.master = master

root = App1(None)
You are passing the value None to the __init__ method of class App1. So in line 9 of your code:
self.master = master

you are defining self.master as None, which is why you can't call self.master.after in your update_reading() function.
 

tjohnson

Joined Dec 23, 2014
611
Try changing your code to:
Python:
from Tkinter import *
from random import randint

class App1(Frame):
  
    def __init__(self, master):
        Frame.__init__(self,master)
        self.master = master

        self.label = Label(self , text = "Voltage" , font = ("Helvetica",32))
        self.label.grid(row = 0)

        self.reading_label = Label(self,text = '0.0' , font = ("Helvetica",110))
        self.reading_label.grid(row = 1)
        self.update_reading()


    def update_reading(self):
        value = randint(0,9)
        reading_str = "{:.2f}".format(value)
        self.reading_label.configure(text = reading_str)
        root.after(1 , self.update_reading)


root = Tk()
app = App1(root)
app.title("Option")
app.geometry("320x240")
app.mainloop()
I haven't tested this, but I think it should work.
 
Top