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)