patternpythonMinor
Very Ugly Tkinter Calculator
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
```
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.