1

este código que tengo de una calculadora simple funciona perfectamente, pero cuando lo importo a otro archivo, al abrir la calculadora, cuando pulso sobre un botón, no aparece en la "pantalla" de la calculadora (que es un Entry de Tkinter), alguien sabe por qué puede ser? Este es el código de la calculadora que tengo, en init tengo definido pantalla que es un entry y funciona si ejecuto el archivo calculadora:

from tkinter import *
class Calculadora():
    def __init__(self):
        raiz = Tk()
        raiz.title("Calculadora Sencilla")
        raiz.resizable(False,False)
        frame = Frame(raiz)
        frame.config(width=600,height=300)
        frame.pack()

        #---------pantalla---------
        self.__res = 0.0
        self.__nums = 0.0
        self.__numero_sin_puntos ="0"
        self.__ultima_operacion="last"
        self.__primera_operacion = True
        self.__numero_pantalla = StringVar()
        self.__numero_pantalla.set("0")
        pantalla = Entry(frame,textvariable=self.__numero_pantalla,width=20)
        pantalla.grid(row=1,column=0,pady=10)
        pantalla.config(bg="black",fg="#03f943",justify="right")
        #---------Fila 1-----------
        frame_botones = Frame(raiz)
        frame_botones.config(width=600,height=300)
        frame_botones.pack()
        #podemos hacer en pantalla.grid(columspan=4) que equivale a que la pantalla ocupe 4 columnas, es decir
        #seria lo mismo que he hecho pero sin 2 frames.
        boton7 = Button(frame_botones,text="7",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(7))
        boton7.grid(row=0,column=0)
        boton8 = Button(frame_botones,text="8",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(8))
        boton8.grid(row=0,column=1)
        boton9 = Button(frame_botones,text="9",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(9))
        boton9.grid(row=0,column=2)
        boton_div = Button(frame_botones,text="/",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("/"))
        boton_div.grid(row=0 ,column=3)

        #---------Fila 2-----------
        boton4 = Button(frame_botones,text="4",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(4))
        boton4.grid(row=1,column=0)
        boton5 = Button(frame_botones,text="5",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(5))
        boton5.grid(row=1,column=1)
        boton6 = Button(frame_botones,text="6",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(6))
        boton6.grid(row=1,column=2)
        boton_mult = Button(frame_botones,text="X",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("*"))
        boton_mult.grid(row=1,column=3)


        #---------Fila 3-----------
        boton1 = Button(frame_botones,text="1",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(1))
        boton1.grid(row=2,column=0)
        boton2 = Button(frame_botones,text="2",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(2))
        boton2.grid(row=2,column=1)
        boton3 = Button(frame_botones,text="3",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(3))
        boton3.grid(row=2,column=2)
        boton_rest = Button(frame_botones,text="-",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("-"))
        boton_rest.grid(row=2,column=3)



        #---------Fila 4-----------
        boton0 = Button(frame_botones,text="0",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(0))
        boton0.grid(row=3,column=0)
        boton_coma = Button(frame_botones,text=",",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion(","))
        boton_coma.grid(row=3,column=1)
        boton_igual = Button(frame_botones,text="=",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("="))
        boton_igual.grid(row=3,column=2)
        boton_sum = Button(frame_botones,text="+",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("+"))
        boton_sum.grid(row=3,column=3)
    
        raiz.mainloop()
    #---------Funcion Botones-------
    def contar_numeros_string(self,s):
        return (s.count("0")+s.count("1")+s.count("2")+s.count("3")+s.count("4")+s.count("5")+s.count("6")
                +s.count("7")+s.count("8")+s.count("9"))

    def pulsar_boton_numero(self,numero):
            aux = self.__numero_pantalla.get()
            if self.__nums == 0.0:
                self.__numero_pantalla.set(str(numero))
                self.__numero_sin_puntos = str(numero)
            else:
                if aux.find(",") == -1:
                    if len(aux)==3 or (len(aux) > 3 and self.contar_numeros_string(aux)%3==0):
                        self.__numero_pantalla.set(self.__numero_pantalla.get()+"."+str(numero))
                    else:
                        self.__numero_pantalla.set(self.__numero_pantalla.get()+str(numero))
                else:
                    self.__numero_pantalla.set(self.__numero_pantalla.get()+str(numero))
                self.__numero_sin_puntos = self.__numero_sin_puntos + str(numero)
            self.__nums = float(self.__numero_sin_puntos)
            print(self.__numero_pantalla.get())
    def pulsar_boton_operacion(self,operacion):
        if operacion == ",":
            if self.__numero_sin_puntos.count(".") == 0:
                self.__numero_sin_puntos = self.__numero_sin_puntos+"."
                self.__numero_pantalla.set(self.__numero_pantalla.get()+",")
        else:
            if operacion == "=":
                if self.__ultima_operacion == "+":
                    self.__res = float(self.__res+self.__nums)
                elif self.__ultima_operacion == "-":
                    self.__res = float(self.__res-self.__nums)
                elif self.__ultima_operacion == "/":
                    try:
                        self.__res = float(self.__res / self.__nums)
                    except ZeroDivisionError:
                        print("Esta intentando dividir entre cero")
                elif self.__ultima_operacion == "*":
                    self.__res = float(self.__res * self.__nums)
                self.__numero_pantalla.set(self.__res)
                self.__res = 0.0
                self.__nums = 0.0
                self.__numero_sin_puntos = "0"
                self.__primera_operacion = True
            else:
                if self.__primera_operacion:
                    self.__res = self.__nums
                    self.__primera_operacion = False
                else:
                    if self.__ultima_operacion =="+":
                        self.__res = self.__res+self.__nums
                    elif self.__ultima_operacion == "-":
                        self.__res = self.__res-self.__nums
                    elif self__ultima_operacion == "/":
                        try:
                            self.__res = float(self.__res / self.__nums)
                        except ZeroDivisionError:
                            print("Esta intentando dividir entre cero")
                    elif self.__ultima_operacion == "*":
                        self.__res = self.__res * self.__nums
                self.__nums = 0.0
                self.__ultima_operacion = operacion
                self.__numero_pantalla.set(self.__res)

if __name__=="__main__":
    calculadora = Calculadora()

Aqui esta el archivo donde importo la calculadora y lo ejecuto cuando selecciono la opción nueva calculadora del barra de menu que he creado, pero la pantalla de la calculadora no cambia el valor nunca.

from tkinter import *
from tkinter import messagebox
from calculadora import Calculadora
raiz = Tk()

#Funcion que creará una ventana emergente:
def info_adicional():
    messagebox.showinfo("Procesador de Juan","Procesador de texto 2018")
def abrir_calculadora():
    c = Calculadora()
def info_warning():
    messagebox.showwarning("Warning!","No sabemos que procesador tiene")
def salir_app():
    valor = messagebox.askokcancel("Salir","Sales?")
    if valor==True:
        raiz.destroy()
#Creo la barra del menu:
barra_menu = Menu(raiz)
raiz.config(menu=barra_menu,width=300,height=300) #hay que configurarlo en raiz siempre

#Creo un elemento para la barra del menu:
archivoMenu = Menu(barra_menu,tearoff=True)
archivoMenu.add_command(label="Nueva Calculadora",command=abrir_calculadora)
archivoMenu.add_command(label="Guardar")
archivoMenu.add_command(label="Guardar como")
archivoMenu.add_separator() #crea un separador
archivoMenu.add_command(label="Cerrar")
archivoMenu.add_command(label="Salir",command=salir_app)


archivoEdicion = Menu(barra_menu)
archivoEdicion.add_command(label="Copiar")
archivoEdicion.add_command(label="Cortar")
archivoEdicion.add_command(label="Pegar")


archivoHerramienta = Menu(barra_menu)

archivoAyuda = Menu(barra_menu)
archivoAyuda.add_command(label="Licencia",command=info_warning)

archivoAyuda.add_command(label="Acerca de...",command=info_adicional)

#aniado los elementos creados a la barra menu
barra_menu.add_cascade(label="Archivo", menu = archivoMenu)

barra_menu.add_cascade(label="Edicion", menu = archivoEdicion)

barra_menu.add_cascade(label="Herramientas", menu = archivoHerramienta)

barra_menu.add_cascade(label="Ayuda", menu = archivoAyuda)

raiz.mainloop()```
Ming Ye
  • 25
  • 3

1 Answers1

1

La falla que veo, es que estas declarando la ventana raiz como Tk() en tu 2do código, al llamar la Clase calculadora() también raíz es una ventana principal Tk().. El error lo puedes solucionar validando con un if__name__=="__main__": dentro de la clase... Esto nos va a permitir validar si estamos ejecutando dentro el programa principal (asignaría raiz.Tk()) o lo ejecutamos como módulo (asignaría raiz.Toplevel()) ya que pasaría a ser una ventana hija:

class Calculadora():
    def __init__(self):
        if __name__=="__main__":
            raiz = Tk()
        else:
            raiz = Toplevel()

Tu 1er código quedaría así:

from tkinter import *
class Calculadora():
    def __init__(self):
        
        # --- LA MODIFICACION ---

        if __name__=="__main__":
            raiz = Tk()
        else:
            raiz = Toplevel()

        #---- FIN DE LA MODIFICACIÓN ----
            
        raiz.title("Calculadora Sencilla")
        raiz.resizable(False,False)
        frame = Frame(raiz)
        frame.config(width=600,height=300)
        frame.pack()

        #---------pantalla---------
        self.__res = 0.0
        self.__nums = 0.0
        self.__numero_sin_puntos ="0"
        self.__ultima_operacion="last"
        self.__primera_operacion = True
        self.__numero_pantalla = StringVar()
        self.__numero_pantalla.set("0")
        pantalla = Entry(frame,textvariable=self.__numero_pantalla,width=20)
        pantalla.grid(row=1,column=0,pady=10)
        pantalla.config(bg="black",fg="#03f943",justify="right")
        #---------Fila 1-----------
        frame_botones = Frame(raiz)
        frame_botones.config(width=600,height=300)
        frame_botones.pack()
        #podemos hacer en pantalla.grid(columspan=4) que equivale a que la pantalla ocupe 4 columnas, es decir
        #seria lo mismo que he hecho pero sin 2 frames.
        boton7 = Button(frame_botones,text="7",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(7))
        boton7.grid(row=0,column=0)
        boton8 = Button(frame_botones,text="8",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(8))
        boton8.grid(row=0,column=1)
        boton9 = Button(frame_botones,text="9",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(9))
        boton9.grid(row=0,column=2)
        boton_div = Button(frame_botones,text="/",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("/"))
        boton_div.grid(row=0 ,column=3)

        #---------Fila 2-----------
        boton4 = Button(frame_botones,text="4",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(4))
        boton4.grid(row=1,column=0)
        boton5 = Button(frame_botones,text="5",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(5))
        boton5.grid(row=1,column=1)
        boton6 = Button(frame_botones,text="6",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(6))
        boton6.grid(row=1,column=2)
        boton_mult = Button(frame_botones,text="X",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("*"))
        boton_mult.grid(row=1,column=3)


        #---------Fila 3-----------
        boton1 = Button(frame_botones,text="1",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(1))
        boton1.grid(row=2,column=0)
        boton2 = Button(frame_botones,text="2",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(2))
        boton2.grid(row=2,column=1)
        boton3 = Button(frame_botones,text="3",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(3))
        boton3.grid(row=2,column=2)
        boton_rest = Button(frame_botones,text="-",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("-"))
        boton_rest.grid(row=2,column=3)



        #---------Fila 4-----------
        boton0 = Button(frame_botones,text="0",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_numero(0))
        boton0.grid(row=3,column=0)
        boton_coma = Button(frame_botones,text=",",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion(","))
        boton_coma.grid(row=3,column=1)
        boton_igual = Button(frame_botones,text="=",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("="))
        boton_igual.grid(row=3,column=2)
        boton_sum = Button(frame_botones,text="+",width=5,height=2,justify="center",command=lambda:self.pulsar_boton_operacion("+"))
        boton_sum.grid(row=3,column=3)
    
        raiz.mainloop()
    #---------Funcion Botones-------
    def contar_numeros_string(self,s):
        return (s.count("0")+s.count("1")+s.count("2")+s.count("3")+s.count("4")+s.count("5")+s.count("6")
                +s.count("7")+s.count("8")+s.count("9"))

    def pulsar_boton_numero(self,numero):
            aux = self.__numero_pantalla.get()
            if self.__nums == 0.0:
                self.__numero_pantalla.set(str(numero))
                self.__numero_sin_puntos = str(numero)
            else:
                if aux.find(",") == -1:
                    if len(aux)==3 or (len(aux) > 3 and self.contar_numeros_string(aux)%3==0):
                        self.__numero_pantalla.set(self.__numero_pantalla.get()+"."+str(numero))
                    else:
                        self.__numero_pantalla.set(self.__numero_pantalla.get()+str(numero))
                else:
                    self.__numero_pantalla.set(self.__numero_pantalla.get()+str(numero))
                self.__numero_sin_puntos = self.__numero_sin_puntos + str(numero)
            self.__nums = float(self.__numero_sin_puntos)
            print(self.__numero_pantalla.get())
    def pulsar_boton_operacion(self,operacion):
        if operacion == ",":
            if self.__numero_sin_puntos.count(".") == 0:
                self.__numero_sin_puntos = self.__numero_sin_puntos+"."
                self.__numero_pantalla.set(self.__numero_pantalla.get()+",")
        else:
            if operacion == "=":
                if self.__ultima_operacion == "+":
                    self.__res = float(self.__res+self.__nums)
                elif self.__ultima_operacion == "-":
                    self.__res = float(self.__res-self.__nums)
                elif self.__ultima_operacion == "/":
                    try:
                        self.__res = float(self.__res / self.__nums)
                    except ZeroDivisionError:
                        print("Esta intentando dividir entre cero")
                elif self.__ultima_operacion == "*":
                    self.__res = float(self.__res * self.__nums)
                self.__numero_pantalla.set(self.__res)
                self.__res = 0.0
                self.__nums = 0.0
                self.__numero_sin_puntos = "0"
                self.__primera_operacion = True
            else:
                if self.__primera_operacion:
                    self.__res = self.__nums
                    self.__primera_operacion = False
                else:
                    if self.__ultima_operacion =="+":
                        self.__res = self.__res+self.__nums
                    elif self.__ultima_operacion == "-":
                        self.__res = self.__res-self.__nums
                    elif self__ultima_operacion == "/":
                        try:
                            self.__res = float(self.__res / self.__nums)
                        except ZeroDivisionError:
                            print("Esta intentando dividir entre cero")
                    elif self.__ultima_operacion == "*":
                        self.__res = self.__res * self.__nums
                self.__nums = 0.0
                self.__ultima_operacion = operacion
                self.__numero_pantalla.set(self.__res)

if __name__=="__main__":
    calculadora = Calculadora()

Verifica y nos cuentas

Israel Flores
  • 382
  • 1
  • 13
  • Hola! Me da este error cuando pongo la modificación: File "/Users/bateye/Desktop/Python/Interfaz Grafica/calculadora.py", line 6 raiz = Tk() ^ IndentationError: unindent does not match any outer indentation level – Ming Ye Aug 25 '20 at 10:22
  • Revisa la Identación del código en esa línea 6... Trata de no darle copiar/pegar al código... Son pocas líneas que puedes escribir... Me cuentas como te fue – Israel Flores Aug 25 '20 at 16:05
  • 1
    Ya si me funciona! Muchísimas gracias! – Ming Ye Aug 25 '20 at 17:07
  • Estamos para ayudarnos – Israel Flores Aug 25 '20 at 17:10