Hass786123
Hass786123

Reputation: 676

How to Integrate my python code to my tkinter interface?

I have made a program where the user enter's a target number and 4 other numbers to make that target number. Right now I am having trouble to intergrate my tkinter interface to my code. So I am hoping that some one can help me

Tkinter interface:

window = Tk()
window.title("target number solution")
Label(window,image='', bg="white") .grid(row=0, column=0, sticky=W)
Label(window, text="Enter target number:",bg="black", fg="white", font="none 12 bold").grid(row=1, column=0, sticky=N)
textentry = Entry(window, width=20, bg="white")
textentry.grid(row=2, column=0, sticky=N)


Label(window, text="Enter first number:",bg="black", fg="white", font="none 12 bold").grid(row=4, column=0, sticky=N)
textentry = Entry(window, width=20, bg="white")
textentry.grid(row=5, column=0, sticky=N)


Label(window, text="Enter second number:",bg="black", fg="white", font="none 12 bold").grid(row=6, column=0, sticky=N)
textentry = Entry(window, width=20, bg="white")
textentry.grid(row=7, column=0, sticky=N)


Label(window, text="Enter third number:",bg="black", fg="white", font="none 12 bold").grid(row=8, column=0, sticky=N)
textentry = Entry(window, width=20, bg="white")
textentry.grid(row=9, column=0, sticky=N)


Label(window, text="Enter fourth number:",bg="black", fg="white", font="none 12 bold").grid(row=10, column=0, sticky=N)
textentry = Entry(window, width=20, bg="white")
textentry.grid(row=11, column=0, sticky=N)


Button(window, text="Solve", width=6, command=solver).grid(row=12, column=0, sticky=N)
output = Text(window, width=60, height=10, wrap=WORD, background="white")
output.grid(row=13, column=0, columnspan=1, sticky=N)


window.mainloop()

This is what the interface looks like

This is the code that needs to be linked with the tkinter interface:

from itertools import permutations,combinations_with_replacement
numbers   = []
target    = int(input())
operators = ["+","-","*","/"]
groups    = ['X+X+X+X', 'X+X+(X+X)', 'X+(X+X)+X', '(X+X+X)+X', '(X+X)+X+X', 'X+(X+X+X)', '((X+X)+X)+X', 'X+(X+(X+X))', 'X+((X+X)+X)', '(X+X)+(X+X)', '(X+(X+X))+X']
seen      = set()
for values in permutations(numbers,len(numbers)):
    for operCombo in combinations_with_replacement(operators,len(numbers)-1):
        for oper in permutations(operCombo,len(numbers)-1):
            formulaKey = "".join(oper+values)
            if formulaKey in seen: continue # ignore variations on parentheses alone
            for pattern in groups:
                formula = "".join(o+p for o,p in zip([""]+list(oper), pattern.split("+")))
                formula = "".join(v+p for v,p in zip([""]+list(values),formula.split("X")))
                try:
                    if eval(formula) == target:
                        global Answer
                        Answer = formula,"=",target
                        print(formula,"=",target)
                        seen.add(formulaKey)
                        break
                except: pass

All suggestions will be grealty appriciated

Upvotes: 0

Views: 672

Answers (2)

amanb
amanb

Reputation: 5473

You can store the values for each number in seperate IntVar variables, then get the values of these variables inside the solver function and perform all the operations that are in your second code. The code should be modularised with the use of a class containing functions that create the widgets and run the solver code. To read more about class-based declarations in Tkinter, read this.

from tkinter import Tk, Frame, Label, Button, IntVar, Entry, Text, W, N, WORD, INSERT
from itertools import permutations,combinations_with_replacement



class Application(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack()
        self.create_widgets() 


    def create_widgets(self):

        self.target_num = IntVar()
        self.num1 = IntVar()
        self.num2 = IntVar()
        self.num3 = IntVar()
        self.num4 = IntVar()       
        # self.title("target number solution")

        Label(self,image='', bg="white").grid(row=0, column=0, sticky=W)
        Label(self, text="Enter target number:", bg="black", fg="white", font="none 12 bold").grid(row=1, column=0, sticky=N)
        self.textentry1 = Entry(self, textvariable=self.target_num, width=20, bg="white")
        self.textentry1.grid(row=2, column=0, sticky=N)


        Label(self, text="Enter first number:",bg="black", fg="white", font="none 12 bold").grid(row=4, column=0, sticky=N)
        self.textentry2 = Entry(self, textvariable=self.num1, width=20, bg="white")
        self.textentry2.grid(row=5, column=0, sticky=N)


        Label(self, text="Enter second number:",bg="black", fg="white", font="none 12 bold").grid(row=6, column=0, sticky=N)
        self.textentry3 = Entry(self, textvariable=self.num2, width=20, bg="white")
        self.textentry3.grid(row=7, column=0, sticky=N)


        Label(self, text="Enter third number:",bg="black", fg="white", font="none 12 bold").grid(row=8, column=0, sticky=N)
        self.textentry3 = Entry(self, textvariable=self.num3, width=20, bg="white")
        self.textentry3.grid(row=9, column=0, sticky=N)


        Label(self, text="Enter fourth number:",bg="black", fg="white", font="none 12 bold").grid(row=10, column=0, sticky=N)
        self.textentry4 = Entry(self, textvariable=self.num4, width=20, bg="white")
        self.textentry4.grid(row=11, column=0, sticky=N)


        Button(self, text="Solve", width=6, command=self.solver).grid(row=12, column=0, sticky=N)
        self.output = Text(self, width=60, height=10, wrap=WORD, background="white")
        self.output.grid(row=13, column=0, columnspan=1, sticky=N)

    def solver(self):
        target = self.target_num.get()
        number1 = self.num1.get()
        number2 = self.num2.get()
        number3 = self.num3.get()
        number4 = self.num4.get()
        numbers = [number1, number2, number3, number4]
        operators = ["+","-","*","/"]
        groups    = ['X+X+X+X', 'X+X+(X+X)', 'X+(X+X)+X', '(X+X+X)+X', '(X+X)+X+X', 'X+(X+X+X)', '((X+X)+X)+X', 'X+(X+(X+X))', 'X+((X+X)+X)', '(X+X)+(X+X)', '(X+(X+X))+X']
        seen = set()
        for values in permutations(numbers,len(numbers)):
            for operCombo in combinations_with_replacement(operators,len(numbers)-1):
                for oper in permutations(operCombo,len(numbers)-1):
                    formulaKey = "".join(str(oper+values))
                    if formulaKey in seen: continue # ignore variations on parentheses alone
                    for pattern in groups:
                        formula = "".join(str(o)+str(p) for o,p in zip([""]+list(oper), pattern.split("+")))
                        formula = "".join(str(v)+str(p) for v,p in zip([""]+list(values),formula.split("X")))
                        try:
                            if eval(formula) == target:                              
                                Answer = formula,"=",target
                                print(formula,"=",target)
                                seen.add(formulaKey)
                                #insert value in output Textbox
                                self.output.insert(INSERT, Answer) 
                                self.output.insert(END, '\n') 
                                break
                        except: pass

root = Tk()
app = Application(master=root)
app.master.title("target number solution")
app.mainloop()

Upvotes: 1

FrainBr33z3
FrainBr33z3

Reputation: 1105

A few things that you can change/try:

  • Keep the "Entry" variables unique. Then extract each number using .get() command.
  • Use lambda in the command options of the Button as follows:

    command = lambda: solver(num1, num2, num3, num4)

  • And if you want to display your returned number from 'solver', grid a Label in your tkinter window. Then use Label.config(text="Your number here") to show it in your tkinter window

Upvotes: 0

Related Questions