Home > Net >  Making a GUI with Tkinter
Making a GUI with Tkinter

Time:12-08

When I run the following code:

from tkinter import *

rows = []
for i in range(3):
    cols = []
    for j in range(3):
        e = Entry(relief=RIDGE)
        e.grid(row=i, column=j, sticky=NSEW)
        e.insert(END, '%d.%d' % (i, j))
        cols.append(e)
    rows.append(cols)

def onPress():
    for row in rows:
        for col in row:
            col.get(),
        print()

Button(text='Calculate', command=onPress).grid()
mainloop()

I get a 3 by 3 grid where I can enter six numbers. I want to incorporate the following code into the above code:

x = r_1[0]   r_2[0] - r_3[0]

y = r_1[1]   r_2[1] - r_3[1]

z = r_1[2]   r_2[2] - r_3[2]


num = x   y - z

list = [x, y, z]

i = 0
while (i < 3):
    
    fin = 2000*list[i]*num

    print(fin)
    i = i   1

Such that when I run the code I get an output of three numbers displayed below the "Calculate" button in the grid. The r_1[0] denotes the first entry in the first row of the grid, the r_2[0] denotes the second entry in the first row of the grid etc.

I'm not sure how to make the code work.

CodePudding user response:

You could try something like below:

# Change our import statement to import the tkinter module as tk
import tkinter as tk

# Define our function for the action to complete on our button press
def onPress(rootInstance, output):
    # Get our input values as a dictionary
    inputVals = rootInstance.children
    # Set the values for x, y, and z
    x = float(inputVals['entry00'].get())   float(inputVals['entry01'].get()) - float(inputVals['entry02'].get())
    y = float(inputVals['entry10'].get())   float(inputVals['entry11'].get()) - float(inputVals['entry12'].get())
    z = float(inputVals['entry20'].get())   float(inputVals['entry21'].get()) - float(inputVals['entry22'].get())
    # Get our output label string variables
    outputList = output
    # Process the x, y, and z variables
    num = x   y - z
    # Set our x, y, and z variables to a list
    list = [x, y, z]
    # Iterate over our list and outputList variables in a zipped fashion
    for i, j in zip(list, outputList):
        fin = 2000*i*num
        # Set the value of the output equal to our computed value
        j.set(str(fin))
    # Update our root instance
    rootInstance.update_idletasks()

# Define our main method
def main():
    # Create our root tkinter instance
    root = tk.Tk()
    # Specify size of window
    root.geometry("650x200")
    # Create our input fields
    rows = []
    for i in range(3):
        cols = []
        for j in range(3):
            e = tk.Entry(root, relief=tk.RIDGE, name=('entry'   str(i)   str(j)))
            e.grid(row=i, column=j, sticky=tk.NSEW)
            e.insert(tk.END, '%d.%d' % (i, j))
            cols.append(e)
        rows.append(cols)
    # Add a section for our output below:
    outputText = tk.Label(root, text = "Output", font="Arial 11 bold").grid(row=4, column=0)
    out1 = tk.StringVar()
    out1.set("-")
    out2 = tk.StringVar()
    out2.set("-")
    out3 = tk.StringVar()
    out3.set("-")
    output1 = tk.Label(root, textvariable = out1, name='output1').grid(row=5, column=0)
    output2 = tk.Label(root, textvariable = out2, name='output2').grid(row=5, column=1)
    output3 = tk.Label(root, textvariable = out3, name='output3').grid(row=5, column=2)
    # Add a lambda function to our button command below, so it only executes when we click the button
    button_calc = tk.Button(root, text='Calculate', command= lambda: onPress(root, [out1, out2, out3])).grid(row=3, column=0)
    root.update()
    # Call the main loop of our tkinter instance
    root.mainloop()

# Execute our "main" function below
if __name__ == '__main__':
    main()

That should yield some output like below:

tkinter screenshot

For reference, the thread below talk more about using tkinter with text variables:

https://www.geeksforgeeks.org/python-setting-and-retrieving-values-of-tkinter-variable/

  • Related