I've created this simple GUI:
from tkinter import *
root = Tk()
def grabText(event):
print(entryBox.get())
entryBox = Entry(root, width=60).grid(row=2, column=1, sticky=W)
grabBtn = Button(root, text="Grab")
grabBtn.grid(row=8, column=1)
grabBtn.bind('<Button-1>', grabText)
root.mainloop()
I get the UI up and running. When I click on the Grab
button, I get the following error on the console:
C:\Python> python.exe myFiles\testBed.py
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "myFiles\testBed.py", line 10, in grabText
if entryBox.get().strip()=="":
AttributeError: 'NoneType' object has no attribute 'get'
Why is entryBox
set to None
?
The grid
, pack
and place
functions of the Entry
object and of all other widgets returns None
. In python when you do a().b()
, the result of the expression is whatever b()
returns, therefore Entry(...).grid(...)
will return None
.
You should split that on to two lines like this:
entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)
That way you get your Entry
reference stored in entryBox
and it's laid out like you expect. This has a bonus side effect of making your layout easier to understand and maintain if you collect all of your grid
and/or pack
statements in blocks.
Change this line:
entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W)
into these two lines:
entryBox=Entry(root,width=60)
entryBox.grid(row=2, column=1,sticky=W)
Just as you already correctly do for grabBtn
!
Alternative solution for Python3.8+
versions that allows to put all of this in one line using the walrus operator
:
(entryBox := Entry(root, width=60)).grid(row=2, column=1, sticky=W)
Now entryBox
will refer to the Entry
widget and also get packed.
For characters per line management I can suggest something like this:
(var := Button(
text='fine', command=some_func, width=20, height=15, activebackground='grey'
)).grid(row=0, column=0, columnspan=0, rowspan=0, sticky='news')
But at that point might as well just do this "normally" (as suggested by other answers)
Sources:
walrus operator
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With