_tkinter.TclError: невозможно вызвать команду «кнопка»: приложение было уничтожено - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь создать окно меню, которое выбирает тип калькулятора, который вам нужен. Когда я нажимаю на кнопку, он должен открыть новое окно для расчета. Но когда я пытаюсь поместить кнопку в окно, оновыдает ошибку, которая приведена в заголовке. Может ли кто-нибудь помочь мне исправить это. Большое спасибо

from tkinter import *
from tkinter import messagebox
import sys

cca=0

def cc():
    global cca
    cca=1
    menu.destroy()

class Cal:
    def __init__(self,cal):
        self.root=Tk()
        self.root.geometry("400x400")
        self.root.title("Currency Converter")

        self.us=StringVar()
        self.usd=Entry(self.root,textvariable=self.us)
        self.usd.grid(row=3,column=1)
        self.us.set("0")

        self.rate=StringVar()
        self.raten=Entry(self.root,textvariable=self.rate)
        self.raten.grid(row=4,column=1)
        self.rate.set("0")

        self.buttona=Button(self.root,text="-->",command=self.convert1).grid(row=4,column=2,rowspan=2)
        self.buttonb=Button(self.root,text="<--",command=self.convert2).grid(row=6,column=2,rowspan=2)
        self.buttonc=Button(self.root,text="Quit",command=self.root.quit).grid(row=8,column=2)

        self.china=StringVar()
        self.china.set("0")
        self.chn=Entry(self.root,textvariable=self.china)
        self.chn.grid(row=3, column=2)
        self.root.mainloop()

    def convert1(self):
        cal=float(self.rate.get())
        u=eval(self.us.get())
        c=cal*u
        cc=round(c,4)
        self.china.set(cc)

    def convert2(self):
        cal=float(self.rate.get())
        s=eval(self.china.get())
        ss=s/cal
        sss=round(ss,2)
        self.us.set(sss)

menu=Toplevel()
menu.geometry("400x400")
menu.title("UniCal 1.0")
menu.mainloop()

buttoncc=Button(menu,text="Currency Converter",command=cc).grid(row=3,column=4)
if cca==1:
    lol=Cal(5)

1 Ответ

0 голосов
/ 15 октября 2018

Ваша ошибка в том, что вы вызываете menu.mainloop () перед созданием вашего buttoncc и дважды вызываете mainloop ().

лучше было бы создать окно Toplevel, подобное этому:

from tkinter import *
from tkinter import messagebox
import sys

class Cal:
    def __init__(self, master, cal):
        self.master = master
        self.root = Toplevel(self.master)
        self.root.title("Currency Converter")
        self.root.geometry("400x400")

        self.us=StringVar()
        self.usd=Entry(self.root,textvariable=self.us)
        self.usd.grid(row=3,column=1)
        self.us.set("0")
        self.rate=StringVar()
        self.raten=Entry(self.root,textvariable=self.rate)
        self.raten.grid(row=4,column=1)
        self.rate.set("0")
        self.buttona=Button(self.root,text="-->",command=self.convert1).grid(row=4,column=2,rowspan=2)
        self.buttonb=Button(self.root,text="<--",command=self.convert2).grid(row=6,column=2,rowspan=2)
        self.buttonc=Button(self.root,text="Quit",command=self.root.quit).grid(row=8,column=2)
        self.china=StringVar()
        self.china.set("0")
        self.chn=Entry(self.root,textvariable=self.china)
        self.chn.grid(row=3, column=2)

    def convert1(self):
        cal=float(self.rate.get())
        u=eval(self.us.get())
        c=cal*u
        cc=round(c,4)
        self.china.set(cc)

    def convert2(self):
        cal=float(self.rate.get())
        s=eval(self.china.get())
        ss=s/cal
        sss=round(ss,2)
        self.us.set(sss)

class My_Root(Frame):

    def __init__(self, master):
        self.master = master
        Frame.__init__(self, self.master)
        self.grid()
        self.buttoncc=Button(self,text="Currency Converter",command=self.new_toplevel)
        self.buttoncc.grid(row=0,column=0)

    def new_toplevel(self):
        self.myToplevel = Cal(self, 5)

if __name__ == "__main__":

    root=Tk()
    root.geometry("400x400")
    root.title("UniCal 1.0")   
    app = My_Root(root)
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...