HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonMinor

Very Ugly Tkinter Calculator

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
uglytkintercalculatorvery

Problem

I have been working for about a week on a calculator in Tkinter, and the result is a very ugly, but functional calculator. Is it possible to clean up the code, and make it more readable?

```
from Tkinter import *
import tkMessageBox
import sys
import os
import math
main = Tk()
string = []
x = 'add'
def exit():
sys.exit()
def addNumberOne():
string.append(1.0)
Label(main, text = "1").grid(row = 0, column = 0)
def addNumberTwo():
string.append(2.0)
print '2'
Label(main, text = "2").grid(row = 0, column = 0)
def addNumberThree():
string.append(3.0)
print '3'
Label(main, text = "3").grid(row = 0, column = 0)
def addNumberFour():
string.append(4.0)
print '4'
Label(main, text = "4").grid(row = 0, column = 0)
def addNumberFive():
string.append(5.0)
print '5'
Label(main, text = "5").grid(row = 0, column = 0)
def addNumberSix():
string.append(6.0)
Label(main, text = "6").grid(row = 0, column = 0)
def addNumberSeven():
string.append(7.0)
print '7'
Label(main, text = "7").grid(row = 0, column = 0)
def addNumberEight():
string.append(8.0)
print '8'
Label(main, text = "8").grid(row = 0, column = 0)
def addNumberNine():
string.append(9.0)
print '9'
Label(main, text = "9").grid(row = 0, column = 0)
def addNumberZero():
string.append(0)
print '0'
Label(main, text = "0").grid(row = 0, column = 0)
def add():
global x
x = 'add'
Label(main, text = "+").grid(row = 0, column = 1)
#Label(main, text = "You have selected addition.").pack()
#tkMessageBox.showinfo( "The Answer Is:", "%d"%(
Label(main, text = 'Changed operator to "add"').grid(row = 1, column = 4, columnspan = 30)
def sub():
global x
x = 'sub'
Label(main, text = "-").grid(row = 0, column = 1)
Label(main, text = 'Changed

Solution

enter()

def enter():
        global x
        if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))
                #Label(main, text = "%f"%(string[0] + string[1])).grid(row = 0, column = 3)
                #tkMessageBox.showinfo( "The Answer Is:", "%d"%(string[0] + string[1]))
        elif x == 'sub':
        #        Label(main, text = "The answer is: %d"%(string[0] - string[1])).pack()
        #        tkMessageBox.showinfo( "The Answer Is:", "%d"%(string[0] - string[1]))
    #   Label(main, text = "%f"%(string[0] - string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] - string[1]))
    elif x == 'mul':
        #Label(main, text = "%f"%(string[0] * string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] * string[1]))
    elif x == 'div':
        #Label(main, text = "%f"%(string[0] / string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] / string[1]))
        string.pop(0)
        string.pop(0)


  • Remove the noisy comments



These seem to be past code that you are no longer using. Get rid of them; they are making your code harder to read.

def enter():
        global x
        if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))

        elif x == 'sub':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] - string[1]))
    elif x == 'mul':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] * string[1]))
    elif x == 'div':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] / string[1]))
        string.pop(0)
        string.pop(0)


  • Your indentation is incosistent and incorrect



Some lines have an extra indent, like the if for 'add' and the lines when you are setting the position of answer.

def enter():
    global x
    if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))

    elif x == 'sub':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] - string[1]))

    elif x == 'mul':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] * string[1]))

    elif x == 'div':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] / string[1]))
        
    string.pop(0)
    string.pop(0)


  • You are repeating code



Notice some consistent among each case of your if/elif statement? These lines:

answer = Entry(main)
answer.grid(row = 0, column = 3, columnspan = 30)


Put these two lines at the top of your function, just before if/elif statement and then remove them from the rest of your function.

def enter():
    global x
    answer = Entry(main)
    answer.grid(row = 0, column = 3, columnspan = 30)
    if x == 'add':
        answer.insert(0, "%f"%(string[0] + string[1]))

    elif x == 'sub':
        answer.insert(0, "%f"%(string[0] - string[1]))

    elif x == 'mul':
        answer.insert(0, "%f"%(string[0] * string[1]))

    elif x == 'div':
        answer.insert(0, "%f"%(string[0] / string[1]))
        
    string.pop(0)
    string.pop(0)


  • This function will build up in noise as you expand your calculator.



Sometime in the future, you may try and add more functions to this calculator. Depending on how many more functions you add, this if/elif statement can get quite lengthy. And, some operations won't just be a single character like "+" or "/".

I recommend creating a dictionary/map where you map the name of an operation to a function. Then, in this function, all you have to do is call the function associated with the operation.

Here is what I mean:

operations = {
    "add": add,
    "sub": sub,
    "mul": mul,
    "div", div
}


Where the functions add, sub, mul, and div arithmetic functions that will take two numerical parameters.

Now, your enter function becomes this:

def enter():
    global x
    operations[x](string[0], string[1])

    string.pop(0)
    string.pop(0)


Check that out. This function just went from a giant jumble of text to just 4 lines.

Code Snippets

def enter():
        global x
        if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))
                #Label(main, text = "%f"%(string[0] + string[1])).grid(row = 0, column = 3)
                #tkMessageBox.showinfo( "The Answer Is:", "%d"%(string[0] + string[1]))
        elif x == 'sub':
        #        Label(main, text = "The answer is: %d"%(string[0] - string[1])).pack()
        #        tkMessageBox.showinfo( "The Answer Is:", "%d"%(string[0] - string[1]))
    #   Label(main, text = "%f"%(string[0] - string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] - string[1]))
    elif x == 'mul':
        #Label(main, text = "%f"%(string[0] * string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] * string[1]))
    elif x == 'div':
        #Label(main, text = "%f"%(string[0] / string[1])).grid(row = 0, column = 3)
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] / string[1]))
        string.pop(0)
        string.pop(0)
def enter():
        global x
        if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))

        elif x == 'sub':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] - string[1]))
    elif x == 'mul':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] * string[1]))
    elif x == 'div':
        answer = Entry(main)
                answer.grid(row = 0, column = 3, columnspan = 30)
                answer.insert(0, "%f"%(string[0] / string[1]))
        string.pop(0)
        string.pop(0)
def enter():
    global x
    if x == 'add':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] + string[1]))

    elif x == 'sub':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] - string[1]))

    elif x == 'mul':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] * string[1]))

    elif x == 'div':
        answer = Entry(main)
        answer.grid(row = 0, column = 3, columnspan = 30)
        answer.insert(0, "%f"%(string[0] / string[1]))
        
    string.pop(0)
    string.pop(0)
answer = Entry(main)
answer.grid(row = 0, column = 3, columnspan = 30)
def enter():
    global x
    answer = Entry(main)
    answer.grid(row = 0, column = 3, columnspan = 30)
    if x == 'add':
        answer.insert(0, "%f"%(string[0] + string[1]))

    elif x == 'sub':
        answer.insert(0, "%f"%(string[0] - string[1]))

    elif x == 'mul':
        answer.insert(0, "%f"%(string[0] * string[1]))

    elif x == 'div':
        answer.insert(0, "%f"%(string[0] / string[1]))
        
    string.pop(0)
    string.pop(0)

Context

StackExchange Code Review Q#95707, answer score: 7

Revisions (0)

No revisions yet.