If you have PySide
installed on your machine, the following will create a dialog that does what you want.
IMO, PySide is much easier to use than Tk, and you can very quickly create little applications like this which work quite nicely.

from PySide import QtGui, QtCore
import sys
"""
This class just sets up the actual dialog widget, and puts everything in place.
It was mostly just generated by Qt Designer & pyside-uic though, so there's
no real need to understand it all.
"""
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(402, 182)
self.gridLayout = QtGui.QGridLayout(Dialog)
self.gridLayout.setObjectName("gridLayout")
self.label_formula12 = QtGui.QLabel(Dialog)
self.label_formula12.setObjectName("label_formula12")
self.gridLayout.addWidget(self.label_formula12, 3, 0, 1, 2)
self.buttonBox = QtGui.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 2)
self.label_v1 = QtGui.QLabel(Dialog)
self.label_v1.setObjectName("label_v1")
self.gridLayout.addWidget(self.label_v1, 0, 0, 1, 1)
self.lineEdit_v1 = QtGui.QLineEdit(Dialog)
self.lineEdit_v1.setObjectName("lineEdit_v1")
self.gridLayout.addWidget(self.lineEdit_v1, 0, 1, 1, 1)
self.label_v2 = QtGui.QLabel(Dialog)
self.label_v2.setObjectName("label_v2")
self.gridLayout.addWidget(self.label_v2, 1, 0, 1, 1)
self.lineEdit_v2 = QtGui.QLineEdit(Dialog)
self.lineEdit_v2.setObjectName("lineEdit_v2")
self.gridLayout.addWidget(self.lineEdit_v2, 1, 1, 1, 1)
self.label_bevel = QtGui.QLabel(Dialog)
self.label_bevel.setObjectName("label_bevel")
self.gridLayout.addWidget(self.label_bevel, 2, 0, 1, 2)
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 4, 0, 1, 2)
self.label_v1.setBuddy(self.lineEdit_v1)
self.label_v2.setBuddy(self.lineEdit_v2)
self.retranslateUi(Dialog)
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), Dialog.accept)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle("Formula 12")
self.label_formula12.setText("Formula 12")
self.label_v1.setText("Value &1:")
self.label_v2.setText("Vaule &2:")
self.label_bevel.setText("Bevel")
"""
Here we add the actual functionality to the widgets in the dialog. The
functionality it simple, there are just a few differences from Tk, namely the
use of `signals` and `slots`. The
"""
class MainWindow(QtGui.QDialog):
def __init__(self,parent=None):
super(MainWindow, self).__init__(parent)
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.lineEdit_v1
qDoubleValidator = QtGui.QDoubleValidator()
self.ui.lineEdit_v1.setText("0.0")
self.ui.lineEdit_v2.setText("0.0")
"""
Here's the magic that forces the numbers in the `lineEdit`s to be
real numbers.
"""
self.ui.lineEdit_v1.setValidator(qDoubleValidator)
self.ui.lineEdit_v2.setValidator(qDoubleValidator)
"""
Signals and Slots. The first set wait until editing is finished - i.e.
when foucs leaves the box. The second set offer real time updating.
"""
#self.ui.lineEdit_v1.editingFinished.connect(self.updateValues)
#self.ui.lineEdit_v2.editingFinished.connect(self.updateValues)
self.ui.lineEdit_v1.textEdited.connect(self.updateValues)
self.ui.lineEdit_v2.textEdited.connect(self.updateValues)
self.updateValues()
def updateValues(self):
try:
self.value1 = float(self.ui.lineEdit_v1.text())
self.value2 = float(self.ui.lineEdit_v2.text())
self.bevel = self.calculateBevel()
self.formula12 = self.calculateFormula12()
self.ui.label_bevel.setText("Bevel = %10.5f" % self.bevel)
self.ui.label_formula12.setText("Formula12 = %10.5f" % self.formula12)
except ValueError:
print "one of the values could not be cast to a float"
def calculateBevel(self):
return 3.5 * 2 * (self.value1 + self.value2) / 100
def calculateFormula12(self):
return 2.4 * 1.1 * (self.bevel + 44 + 86.67 * self.value1 * self.value2 / 10000)
def main():
app = QtGui.QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()