¿Cómo puedo progtwigr una calculadora con una GUI usando tkinter en Python?

Estoy tomando computación para GCSE y una de las tareas para nuestra evaluación controlada es crear una calculadora con una GUI.

Soy capaz de progtwigr una calculadora simple sin una GUI pero no entiendo exactamente cómo se puede hacer con una GUI.

A continuación hay un código que recibí de teampython.wordpress.com, que entiendo vagamente, pero sería muy útil si alguien pudiera explicarme cada paso individual.

# calc.py - a Python calculator from tkinter import * class Calc(): def __init__(self): self.total = 0 self.current = "" self.new_num = True self.op_pending = False self.op = "" self.eq = False def num_press(self, num): self.eq = False temp = text_box.get() temp2 = str(num) if self.new_num: self.current = temp2 self.new_num = False else: if temp2 == '.': if temp2 in temp: return self.current = temp + temp2 self.display(self.current) def calc_total(self): self.eq = True self.current = float(self.current) if self.op_pending == True: self.do_sum() else: self.total = float(text_box.get()) def display(self, value): text_box.delete(0, END) text_box.insert(0, value) def do_sum(self): if self.op == "add": self.total += self.current if self.op == "minus": self.total -= self.current if self.op == "times": self.total *= self.current if self.op == "divide": self.total /= self.current self.new_num = True self.op_pending = False self.display(self.total) def operation(self, op): self.current = float(self.current) if self.op_pending: self.do_sum() elif not self.eq: self.total = self.current self.new_num = True self.op_pending = True self.op = op self.eq = False def cancel(self): self.eq = False self.current = "0" self.display(0) self.new_num = True def all_cancel(self): self.cancel() self.total = 0 def sign(self): self.eq = False self.current = -(float(text_box.get())) self.display(self.current) sum1 = Calc() root = Tk() calc = Frame(root) calc.grid() root.title("Calculator") text_box = Entry(calc, justify=RIGHT) text_box.grid(row = 0, column = 0, columnspan = 3, pady = 5) text_box.insert(0, "0") numbers = "789456123" i = 0 bttn = [] for j in range(1,4): for k in range(3): bttn.append(Button(calc, text = numbers[i])) bttn[i].grid(row = j, column = k, pady = 5) bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) i += 1 bttn_0 = Button(calc, text = "0") bttn_0["command"] = lambda: sum1.num_press(0) bttn_0.grid(row = 4, column = 1, pady = 5) bttn_div = Button(calc, text = chr(247)) bttn_div["command"] = lambda: sum1.operation("divide") bttn_div.grid(row = 1, column = 3, pady = 5) bttn_mult = Button(calc, text = "x") bttn_mult["command"] = lambda: sum1.operation("times") bttn_mult.grid(row = 2, column = 3, pady = 5) minus = Button(calc, text = "-") minus["command"] = lambda: sum1.operation("minus") minus.grid(row = 3, column = 3, pady = 5) point = Button(calc, text = ".") point["command"] = lambda: sum1.num_press(".") point.grid(row = 4, column = 0, pady = 5) add = Button(calc, text = "+") add["command"] = lambda: sum1.operation("add") add.grid(row = 4, column = 3, pady = 5) neg= Button(calc, text = "+/-") neg["command"] = sum1.sign neg.grid(row = 5, column = 0, pady = 5) clear = Button(calc, text = "C") clear["command"] = sum1.cancel clear.grid(row = 5, column = 1, pady = 5) all_clear = Button(calc, text = "AC") all_clear["command"] = sum1.all_cancel all_clear.grid(row = 5, column = 2, pady = 5) equals = Button(calc, text = "=") equals["command"] = sum1.calc_total equals.grid(row = 5, column = 3, pady = 5) root.mainloop() 

    Por lo tanto, voy a explicar el código que has dado lo mejor que lo entiendo. La clase Calc() contiene todas las funciones para este fragmento de código. La estructura significa que la GUI principal (configurada más adelante) puede acceder a cada función fácilmente. Dentro de la clase Calc() , tiene sus funciones (denotadas por def etc.). Estos contienen los diversos métodos por los cuales este código calcula su salida.

    Fuera de la clase, tenemos el código de interfaz de usuario de Tkinter. Este código construye su ventana dentro de la cual se sientan sus diferentes botones y pantallas. La posición de los botones y campos de texto en este caso se rige por el método de “cuadrícula”. Como puede ver, cada vez que el código configura un objeto (aquí solo los objetos de Frame , Button y Entry ), hay un .grid(row=x, column=y...etc) asociado .grid(row=x, column=y...etc) . Esto especifica las posiciones relativas de cada objeto en la interfaz de usuario. Por ejemplo, utilizando el método de cuadrícula, podría astackr dos objetos dando la primera fila de objetos = 1, columna = 0 y la segunda fila = 2, columna = 0, etc.

    El bucle for:

     for j in range(1,4): for k in range(3): bttn.append(Button(calc, text = numbers[i])) bttn[i].grid(row = j, column = k, pady = 5) bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x) i += 1 

    Probablemente sea la única parte de la interfaz de usuario que no sea sencilla de ver si recién estás comenzando. En esencia, todo lo que hace es construir botones automáticamente (ahorrándole tiempo para codificar cada uno individualmente). Las dos primeras líneas en el bucle son (con suerte) obviamente en bucle sobre valores en rangos especificados. Debajo de la línea bttn.append(... crea un objeto de botón en el marco de cálculo creado anteriormente calc = Frame (raíz), con el texto del botón dado por la lista de números (literalmente numbers="789456123" arriba). Inicialmente, i = 0, por lo que los números [i] devolverían el primer elemento de la lista, los números [i] para i = 1 (la próxima vez que se repita) darían 8 y así sucesivamente. El bttn.grid(row = j, column = k, pady = 5) utiliza el método de posicionamiento de cuadrícula mencionado anteriormente, pero aquí los valores de j y k vienen dados por el propio bucle (valores entre 1 y 4 en el caso de filas, y valores entre 0 y 2 – 3 columnas – en el caso de columnas). Si ejecuta el código, puede ver que esto ubicará todos los botones del teclado para ingresar números. La última línea de este bucle (además de i + = 1, es decir, agregue 1 a i), se encarga de asignar el botón a un comando. El comando llamará a una función asociada, en este caso la función numpress en Calc() . Como podrá ver, numpress actualiza su ingenio de pantalla Cualquier número que presione.

    El bloque final de código en este ejemplo maneja las operaciones restantes para la calculadora, y notará que cada una también sigue el patrón anterior de crear un botón, asignando un comando y colocando el botón en la IU. Con lo que he explicado anteriormente, puede ver que cada una de las funciones restantes en Calc() gobierna una operación aritmética, o clara, etc.

    Me doy cuenta de que este es un muro de texto, ¡pero espero que ayude! Si no he estado claro o hay algo en particular que no entiendes, házmelo saber, lo intentaré y lo explicaré (¡no lo he aprendido por mucho tiempo!).

    Puede que encuentre útil esta Guía de interfaz de usuario de Tkinter . Aprendí muchos de los conceptos básicos de esa guía.

    Buena suerte

    Debe usar una biblioteca de GUI en Python como PyQt4 , wxPython o Tkinter . La pregunta es demasiado amplia para darte más detalles.

    Comience con los tutoriales que le enseñan todos los conceptos básicos que necesita saber acerca de la creación de GUI en Python.

    PD: Personalmente, te sugiero que vayas con PyQt .