Esempio n. 1
0
class TelaPontos():

    #==================================================================
    #= Métodos que envolvem a criação e posicionamento de widgets
    #= na janela
    #==================================================================
    def __init__(self, janela, jAnterior):
        self.janela = janela
        self.jAnterior = jAnterior

        # Essas são as listas onde ficarão todos os pontos que serão
        # passados para a classe de ajuste de curvas.
        self.px = []
        self.py = []
        self.sx = []
        self.sy = []

        self.opt = IntVar()

        # Criação de widgets
        self.texto = Label(self.janela,
                           text="Selecione o modo de entrada dos pontos.",
                           bg="azure2")

        self.btn_fit = Button(self.janela,
                              text="Ok",
                              command=self.radio_choice,
                              bg="LightSkyBlue4",
                              width=5)
        self.btn_cancel = Button(self.janela,
                                 text="Voltar",
                                 command=self.voltar,
                                 bg="LightSkyBlue4")

        self.radio_escolha_arquivo = Radiobutton(self.janela,
                                                 variable=self.opt,
                                                 value=1,
                                                 text="Arquivo",
                                                 bg="azure2",
                                                 width=14,
                                                 anchor="w")
        self.radio_escolha_texto = Radiobutton(self.janela,
                                               variable=self.opt,
                                               value=2,
                                               text="Copiar do excel",
                                               bg="azure2",
                                               width=14,
                                               anchor="w")
        self.radio_inserir_pontos = Radiobutton(self.janela,
                                                variable=self.opt,
                                                value=3,
                                                text="Valores",
                                                bg="azure2",
                                                width=14,
                                                anchor="w")
        self.radio_inserir_pontos.select()

        self.tip = Label(self.janela, text="?", bg="LightSkyBlue4", width=3)

        #== Posicionamento de widgets
        self.redesenhar()

        ToolTip(
            self.tip,
            "Valores: Insere um ponto de cada vez\nArquivo: Lê um arquivo csv.\nCopiar do excel: Lê os valores copiados das tabelas de um arquivo Excel\n\nObs: Todos em todas as opções de entrada os pontos devem ser colocados\nno formato: X, Y, Erro de X, Erro de Y."
        )
        '''
        self.frm_upper.pack()
        self.frm_down.pack(side=BOTTOM)
        self.frm_radio.pack(side=RIGHT)
        self.radio_inserir_pontos.grid(row=0, column=3)
        self.radio_escolha_arquivo.grid(row=1, column=3)
        self.radio_escolha_texto.grid(row=2, column=3)
        self.btn_fit.grid(row=4, column=4)
        self.btn_cancel.grid(row=4, column=0)
        '''

    #==================================================================
    #=Função para limpar a janela atual e chamar a janela dos gráficos.
    #=Os pontos lidos são passados para o construtor
    def proxJanelaGrafico(self):
        self.limparJanela()
        TelaGrafico(self.janela, self, self.px, self.sx, self.py, self.sy)

    #==================================================================
    def voltar(self):
        self.limparJanela()
        self.jAnterior.redesenhar()

    #==================================================================
    def redesenhar(self):
        # Posicionamento de widgets
        self.janela.geometry("325x300+400+200")
        self.texto.place(x=13, y=4)
        self.tip.place(x=287, y=4)

        tam = 90
        self.radio_inserir_pontos.place(x=tam, y=30)
        self.radio_escolha_arquivo.place(x=tam, y=52)
        self.radio_escolha_texto.place(x=tam, y=74)

        self.btn_fit.place(x=161, y=260)
        self.btn_cancel.place(x=91, y=260)

    #==================================================================
    def limparJanela(self):
        # Limpando os widgets
        self.texto.place_forget()
        self.tip.place_forget()
        self.btn_fit.place_forget()
        self.btn_cancel.place_forget()
        self.texto.place_forget()
        self.radio_escolha_arquivo.place_forget()
        self.radio_escolha_texto.place_forget()
        self.radio_inserir_pontos.place_forget()

    #==================================================================
    #==================================================================
    #==================================================================
    #=Janela da caixa de texto. Nela, existe uma caixa de texto para onde
    #=os pontos devem ser copiados no formato x - erro x - y - erro y
    def get_by_text(self):
        top_txt = Toplevel()
        top_txt.resizable(False, False)
        top_txt.title("Pontos")
        top_txt.configure(background="azure2")

        #= Criação de widgets
        txt_entry = Text(top_txt)
        frm_btn = Frame(top_txt, bd=10, bg="azure2")
        btn_cancel = Button(frm_btn,
                            text="Cancelar",
                            command=top_txt.destroy,
                            bg="LightSkyBlue4",
                            width=5)

        #= Posicionamento de widgets
        txt_entry.pack()
        frm_btn.pack(side=BOTTOM)
        btn_cancel.pack(side=LEFT)

        #================================================================
        #= Função que valida o conteúdo da Text Entry e recebe os pontos
        #= (chamada ao clicar no botão)
        def get_pontos():
            self.txt_pontos = txt_entry.get("1.0", END)
            try:
                self.px, self.py, self.sx, self.sy = ler_excel(
                    self.txt_pontos)  #método ler_excel do módulo reader
                top_txt.destroy()
                self.proxJanelaGrafico()
            except ValueError:
                messagebox.showwarning("Erro!",
                                       "Valores inseridos incorretamente")

        #==============================

        #= Criação & posicionamento
        Button(frm_btn,
               text="OK",
               command=get_pontos,
               bg="LightSkyBlue4",
               width=5).pack(side=RIGHT)

    #==================================================================
    # Função para criar um novo conjunto de entradas para os pontos e erros
    def append_labels(self, janela):

        self.labels.append(Label(janela, text="X", background="azure2"))
        self.labels[-1].grid(row=self.tam, column=0)
        self.labels.append(Label(janela, text="Y", background="azure2"))
        self.labels[-1].grid(row=self.tam, column=2)
        self.labels.append(Label(janela, text="Erro X", background="azure2"))
        self.labels[-1].grid(row=self.tam, column=4)
        self.labels.append(Label(janela, text="Erro Y", background="azure2"))
        self.labels[-1].grid(row=self.tam, column=6)
        #==================================================
        self.inserts.append(Entry(janela, width=10))
        self.inserts[-1].grid(row=self.tam, column=1)
        self.inserts.append(Entry(janela, width=10))
        self.inserts[-1].grid(row=self.tam, column=3)
        self.inserts.append(Entry(janela, width=10))
        self.inserts[-1].grid(row=self.tam, column=5)
        self.inserts.append(Entry(janela, width=10))
        self.inserts[-1].grid(row=self.tam, column=7)

        self.tam += 1

    #======================================================
    #= Função que itera pelas caixas de texto recebidas
    #= e passa todos os pontos e erros para as listas
    #= de pontos e erros
    def salvar_pontos(self):

        try:
            self.px, self.py, self.sx, self.sy = validar_pontos(self.inserts)
            self.proxJanelaGrafico()
            self.top_pontos.destroy()
        except ValueError:
            messagebox.showwarning("Erro!", "Valores inseridos incorretamente")

        #self.top_pontos.destroy()

    #======================================================
    #= Janela onde os pontos serão inseridos manualmente
    def janela_Inserir_Pontos(self):
        self.top_pontos = Toplevel(bd=10)
        self.top_pontos.resizable(False, False)
        self.top_pontos.title("Pontos")
        self.top_pontos.configure(background="azure2")

        self.tam = 0
        self.labels = []
        self.inserts = []

        #= Criação de widgets
        frame_pontos = Frame(self.top_pontos,
                             height=300,
                             width=500,
                             bd=10,
                             background="azure2")

        btn_add = Button(self.top_pontos,
                         text="Adicionar ponto",
                         bg="LightSkyBlue4")
        btn_cancel = Button(self.top_pontos,
                            text="Cancelar",
                            command=self.top_pontos.destroy,
                            bg="LightSkyBlue4",
                            width=5)
        btn_add["command"] = partial(self.append_labels, frame_pontos)
        btn_ok = Button(self.top_pontos,
                        text="Ok",
                        command=self.salvar_pontos,
                        bg="LightSkyBlue4",
                        width=5)

        #= Posicionamento de widgets
        frame_pontos.pack(side=BOTTOM)

        btn_add.pack(side=RIGHT)
        btn_ok.pack(side=LEFT)
        btn_cancel.pack(side=LEFT)

        #= Cria o primeiro conjunto de entradas
        self.append_labels(frame_pontos)

    #==================================================================
    #= Função que define qual método de inserção será chamado, depenendo
    #= do radio button selecionado
    def radio_choice(self):
        if (self.opt.get() == 1):
            self.get_File()
        elif (self.opt.get() == 2):
            self.get_by_text()
        elif (self.opt.get() == 3):
            self.janela_Inserir_Pontos()

    #==================================================================
    #= Função para o método através do arquivo csv. Abre uma caixa que
    #= solicita um arquivo e passa seu caminho para a função ler_csv
    #= do módulo reader.
    def get_File(self):
        filename = filedialog.askopenfilename(filetypes=[("arquivo csv",
                                                          "*.csv")])
        if filename:
            self.px, self.py, self.sx, self.sy = ler_csv(filename)
            self.proxJanelaGrafico()
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent

        self.initUI()
        self.rb_deep20 = Radiobutton(text="20 мкм",
                                     font="Times 13",
                                     variable=self.deep,
                                     value=20)
        self.rb_deep40 = Radiobutton(text="40 мкм",
                                     font="Times 13",
                                     variable=self.deep,
                                     value=40)
        self.rb_deep50 = Radiobutton(text="50 мкм",
                                     font="Times 13",
                                     variable=self.deep,
                                     value=50)

        self.otris()

    def initUI(self):
        self.parent.title("Simple")
        self.parent.resizable(width=False, height=False)
        self.pack(fill=BOTH, expand=1)
        self.centerWindow()

        self.material = BooleanVar()
        self.side = BooleanVar()
        self.napr = BooleanVar()
        self.method = BooleanVar()
        self.alfa = DoubleVar()
        self.fi = DoubleVar()
        self.ra = DoubleVar()
        self.rz = DoubleVar()
        self.depth = IntVar()
        self.tochn = IntVar()
        self.deep = IntVar()
        self.tochn.set(10)
        rb_deep20 = Radiobutton(text="20 мкм",
                                font="Times 13",
                                variable=self.deep,
                                value=20)
        rb_deep40 = Radiobutton(text="40 мкм",
                                font="Times 13",
                                variable=self.deep,
                                value=40)
        rb_deep50 = Radiobutton(text="50 мкм",
                                font="Times 13",
                                variable=self.deep,
                                value=50)

        label_material = Label(text="Выберите материал:", font="Times 15")

        label_ugol = Label(
            text="Введите угол наклона(\u03B1) и поворота(\u03C6):",
            font="Times 14")

        label_alfa = Label(text="\u03B1 =", font="Times 15")
        label_fi = Label(text="\u03C6 =", font="Times 15")

        label_side = Label(text="Выберите вид поверхности:", font="Times 15")

        label_method = Label(text="Выберите средство измерения:",
                             font="Times 15")

        label_napr = Label(text="Выберите направление измерения:",
                           font="Times 15")

        label_depth = Label(text="Введите толщину слоя:", font="Times 15")

        label_rarz = Label(text="Введите Ra и Rz:", font="Times 15")

        rb_material_x15 = Radiobutton(text="Х15Н5Д4Б",
                                      font="Times 13",
                                      variable=self.material,
                                      value=1)
        rb_material_kx28 = Radiobutton(text="КХ28М6",
                                       font="Times 13",
                                       variable=self.material,
                                       value=0)

        en_alfa = Entry(width=12, font="Arial 13", textvariable=self.alfa)
        en_fi = Entry(width=12, font="Arial 13", textvariable=self.fi)

        rb_side_outer = Radiobutton(text="Наружняя",
                                    font="Times 14",
                                    variable=self.side,
                                    value=1)
        rb_side_inter = Radiobutton(text="Внутренняя",
                                    font="Times 14",
                                    variable=self.side,
                                    value=0)

        rb_napr_prod = Radiobutton(text="Продольное",
                                   font="Times 14",
                                   variable=self.napr,
                                   value=1,
                                   command=self.profiClic)
        rb_napr_poper = Radiobutton(text="Поперечное",
                                    font="Times 14",
                                    variable=self.napr,
                                    value=0,
                                    command=self.profiClic)
        rb_microscope = Radiobutton(text="Микроскоп",
                                    font="Times 14",
                                    variable=self.method,
                                    value=1,
                                    command=self.microClic)
        rb_profilometr = Radiobutton(text="Профилометр",
                                     font="Times 14",
                                     variable=self.method,
                                     value=0,
                                     command=self.profiClic)

        en_depth = Entry(width=15, font="Times 14", textvariable=self.depth)

        en_ra = Entry(width=15, font="Times 14", textvariable=self.ra)
        en_rz = Entry(width=15, font="Times 14", textvariable=self.rz)

        label_toch = Label(text="Введите отклонение в %: ", font="Times 15")
        en_toch = Entry(width=8, font="Times 14", textvariable=self.tochn)

        bCalc = Button(width=15,
                       text="Рассчитать",
                       font="Times 13",
                       command=self.onClick)
        # лабел материала
        label_material.place(x=100, y=10)
        # радиобатан материала
        rb_material_x15.place(x=50, y=50)
        rb_material_kx28.place(x=220, y=50)
        # лаблы углов
        # label_ugol.place(x=40, y=100)
        # label_alfa.place(x=40, y=137)
        # label_fi.place(x=214, y=137)
        # поля ввода углов
        # en_alfa.place(x = 76, y = 140)
        # en_fi.place(x = 250, y = 140)
        # лабел выбора стороны
        label_side.place(x=80, y=100)
        # Выбор стороны
        rb_side_outer.place(x=50, y=140)
        rb_side_inter.place(x=220, y=140)
        # лабел средства
        label_napr.place(x=60, y=190)
        # выбор способа сбора инфы

        rb_napr_prod.place(x=50, y=230)
        rb_napr_poper.place(x=220, y=230)
        # лабел направления
        label_method.place(x=68, y=280)
        # выбор направления
        rb_microscope.place(x=50, y=320)
        rb_profilometr.place(x=220, y=320)
        # лабел толщины
        label_depth.place(x=85, y=370)
        # ввод толщины
        # en_depth.place(x=130, y=410)
        #  if self.method:
        # else:
        #      if self.napr:
        # rb_deep50.place(x=330, y=410)
        # rb_deep20.place(x=50, y=410)
        # rb_deep40.place(x=150, y=410)
        # rb_deep50.place(x=320, y=410)

        label_rarz.place(x=100, y=450)

        en_ra.place(x=50, y=490)
        en_rz.place(x=220, y=490)
        label_toch.place(x=50, y=540)
        en_toch.place(x=275, y=540)
        bCalc.place(x=130, y=650)

    def onClick(self):
        # print(self.depth.get())
        ecl = ECalc()

        di = ecl.eCalc(self.material.get(), self.side.get(), self.method.get(),
                       self.napr.get(), self.alfa.get(), self.fi.get(),
                       self.ra.get(), self.rz.get(), self.deep.get(),
                       self.tochn.get())

        # lb1 = Label(text=di, font="Times 15").place(x=00, y=620)
        lb1 = Label(text="Ra =", font="Times 15").place(x=90, y=580)
        lb2 = Label(text=di.get('ra'), font="Times 15").place(x=130, y=580)
        lb3 = Label(text="\u03B1 =", font="Times 15").place(x=50, y=610)
        lb4 = Label(text=di.get('alfa'), font="Times 15").place(x=90, y=610)
        lb5 = Label(text="\u03C6 =", font="Times 15").place(x=240, y=610)
        lb6 = Label(text=di.get('fi'), font="Times 15").place(x=280, y=610)
        # lb2 = Label(text=ecl.calcRz, font="Times 15").place(x=260, y=620)

    def centerWindow(self):
        w = 400
        h = 700

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))

    def microClic(self):
        self.rb_deep20.place_forget()
        self.rb_deep40.place_forget()
        self.rb_deep50.place_forget()

        self.rb_deep20.place(x=150, y=410)

    def profiClic(self):
        self.rb_deep20.place_forget()
        self.rb_deep40.place_forget()
        self.rb_deep50.place_forget()
        if self.method.get():
            self.rb_deep20.place(x=150, y=410)
        else:
            if self.napr.get():
                self.rb_deep40.place(x=100, y=410)
                self.rb_deep50.place(x=230, y=410)
            else:
                self.rb_deep20.place(x=50, y=410)
                self.rb_deep40.place(x=150, y=410)
                self.rb_deep50.place(x=250, y=410)

    def otris(self):
        self.rb_deep20.place(x=50, y=410)
        self.rb_deep40.place(x=150, y=410)
        self.rb_deep50.place(x=250, y=410)