-1

I am trying to create a programme which gathers experimental data. I have succesfully created a table containing label and entry widgets. However when trying to make the entry widgets functional by gathering entered data, my script fails.

import tkinter as tk
from PIL import ImageTk, Image


class Window(tk.Frame):

def __init__(self, master=None):
   tk.Frame.__init__(self, master)               
   self.master = master
   self.init_window()
def init_window(self):
   self.master.title("Data Analyser")

   tk.Label(self.master, text="Cell Number").grid(row=1, sticky=tk.W)
   tk.Label(self.master, text="1").grid(row=2) 
   tk.Label(self.master, text="1").grid(row=2)      


   tk.Label(self.master, text="Treatment").grid(row=1, column=2)
   Treatment_1 = tk.Entry(self.master).grid(row=2,column=2)
   Treatment_2 = tk.Entry(self.master).grid(row=3,column=2)

   tk.Button(self.master, text = "Submit", command = self.getInput).grid(row = 14, column = 2)

def getInput(self):    
   global Treatment_Data
   a = Treatment_1.get()
   b = Treatment_2.get()
   Treatment_Data = [a,b]



root = tk.Tk()
root.geometry("500x450")
app = Window(root) 
root.mainloop()                                                                                                                                                               

I was hoping the above code would generate a global variable called 'Treatment_Data', but unfortinately I receive the following error message when I click the 'Submit' widget:

 Traceback (most recent call last):
    File "C:\Users\xxxx\lib\tkinter\__init__.py", line 1550, in __call__
    return self.func(*args)
    File "<ipython-input-134-2b5d212a0dcf>", line 47, in getInput
       a = self.Treatment_1.get()
  AttributeError: 'NoneType' object has no attribute 'get'

Any clarification would be greatly appreciated.

1 Answers1

0

You need to use self to make Treatment_1 and Treatment_2 as class variable only then you can access them in the callback function getInput().
Another thing as mentioned in the comment is that you need to separate the two parts -
1. Creating an Entry Widget and
2. placing it in the grid.
You should create an Entry widget and store it in Treatment_1. Once it is done, you should use the Treatment_1 variable to place the widget in the desired position in the grid.

import tkinter as tk
from PIL import ImageTk, Image

class Window(tk.Frame):
   def __init__(self, master=None):
      tk.Frame.__init__(self, master)               
      self.master = master
      self.init_window()
   def init_window(self):
      self.master.title("Data Analyser")
      tk.Label(self.master, text="Cell Number").grid(row=1, sticky=tk.W)
      tk.Label(self.master, text="1").grid(row=2) 
      tk.Label(self.master, text="1").grid(row=2)      
      tk.Label(self.master, text="Treatment").grid(row=1, column=2)
      self.Treatment_1 = tk.Entry(self.master)
      self.Treatment_2 = tk.Entry(self.master)
      self.Treatment_1.grid(row=2,column=2)
      self.Treatment_2.grid(row=3,column=2)
      tk.Button(self.master, text = "Submit", command = self.getInput).grid(row = 14, column = 2)
   def getInput(self):    
      global Treatment_Data
      a = self.Treatment_1.get()
      b = self.Treatment_2.get()
      Treatment_Data = [a,b]
      print(Treatment_Data)

root = tk.Tk()
root.geometry("500x450")
app = Window(root) 
root.mainloop()
Rish
  • 804
  • 8
  • 15