I am trying to write a program that will display 4 rows of 2 columns with column 0 being labels and column 1 being entries. Then, pass those 4 integer entries through as arguments into a function when a button is left clicked. Here is my code so far:
from tkinter import *
root = Tk()
class ClassName():
def __init__(self, master):
self.run_button = Button(self.master, text="Button Text", bg="green", fg="black",
command="HERE IS WHERE I NEED HELP")
self.run_button.grid(row=4, columnspan=2)
self.label1 = Label(master, text="Entry 1").grid(row=0, sticky=E)
self.label2 = Label(master, text="Entry 2").grid(row=1, sticky=E)
self.label3 = Label(master, text="Entry 3").grid(row=2, sticky=E)
self.label4 = Label(master, text="Entry 4").grid(row=3, sticky=E)
self.entry1 = Entry(master).grid(row=0, column=1, sticky=W)
self.entry2 = Entry(master).grid(row=1, column=1, sticky=W)
self.entry3 = Entry(master).grid(row=2, column=1, sticky=W)
self.entry4 = Entry(master).grid(row=3, column=1, sticky=W)
I want to then take the 4 entries and pass them through a different function called the_function. All the_function does is print out something based on the values of the 4 entries. So my remaining code looks like this:
def the_function(self, a, b, c, d):
# Ensure a, b, c, and d are integers,
# do some math on the numbers and print something out based on the
# values of a, b, c and d.
irrelevant_variable = ClassName(root)
root.mainloop()
The function works properly without the GUI but I cannot figure out how to create a button that takes self.entry1 and passes it through as a in the_function.
Other posts have lead me to think I should use the lambda command, but I'm not sure how this would work within this function.
You're on the right track -
lambdaallows you to define an anonymous, in-line function:It basically acts as a wrapper. You could also do this:
And then bind that to the button:
Alternatively, simply have
the_functionget the necessary variables itself:And bind that function without a lambda:
However, this won't help in your current code - chaining your geometry management methods onto your widget creation when you're actually interested in referencing the widget will cause a problem. The widget constructors (
Button(),Entry(), etc.) will return that widget for future reference. However, the geometry management methods (grid(),pack(), etc.) simply act on their widget and returnNone. This means that you're assigningNonetoself.label1,self.entry1, and so on. Separate the widget creation from the geometry management:You will now have actual widgets to work with.