После нажатия кнопки с текстом “метод 1” отрабатывает сообщение (messagebox.showinfo), далее кнопка так и остается в нажатом состоянии. Дефект чисто косметический, но хотелось бы от него избавиться.
Собственно код:
from tkinter import * from tkinter.messagebox import * # функция для фильтрации строк def numbs(x): if '0' <= x <= '9': return 1 elif x == '.': return 1 else: return 0 # функция для проверки и исправления вводимых в entry строк # заменяем ',' на '.'; удаляем все нечисловые символы; обнуляем строку где больше одной точки def check_data(x): # получаем строки из текстовых полей mas = list(range(7)) for n in range(0, 7): mas[n] = ent[n].get() mas[n] = mas[n].replace(",", ".") # отфильтруем из введенных строк все кроме чисел и точек mas1 = list(range(7)) mas2 = list(range(7)) for n in range(0, 7): mas1[n] = filter(numbs, mas[n]) mas1[n] = list(mas1[n]) mas2[n] = ''.join(mas1[n]) # если в строке более 1-й точки if mas2[n].count(".", 0, len(mas2[n])) > 1: mas2[n] = "0" # поместим в текстовые поля исправленные строки for n in range(0, 7): ent[n].delete(0, END) ent[n].insert(0, mas2[n]) def metod_1(event): check_data(0) print("расчет методом 1") # получаем массовые концентрации компонентов (строки) mas = list(range(6)) for n in range(0, 6): mas[n] = ent[n].get() if mas[n] == "": mas[n] = "0" # получаем температуру (строка) T = ent[6].get() if T == "": T = "0" # преобразуем полученные строки в тип float mas1 = list(range(6)) for n in range(0, 6): mas1[n] = float(mas[n]) T1 = float(T) # проверяем корректность введеных данных summ = sum(mas1) if summ != 100.0 or T1 < 1600 or T1 > 2000: messagebox.showinfo("Исправте данные", "Сумма компонентов должна быть 100 \n\ температура должна быть в диапазоне 1600 - 2000 К") else: # данные введены корректно, начинаем расчет a = -(2825/T1)+2.7+0.0165*mas1[1]+0.012*mas1[3]-0.0128*mas1[0]-0.0056*mas1[4]-0.011*mas1[5] M = 10**a M = 0.876*M+3.383 # выводим результаты расчета ent_ex.delete(0, END) ent_ex.insert(0, str(M)) def metod_2(event): print("расчет методом 2") # создание главного окна root = Tk() root.title("Расчет растворимости MgO в шлаках") # создаем метки и строки для входных данных a = ["CaO", "SiO2", "MgO", "Al2O3", "FeO", "MnO", "T, K"] lab = list(range(7)) ent = list(range(7)) i = 0 for x in a: lab[i] = Label(root, text=x, font="Arial 12") ent[i] = Entry(root) i = i + 1 # располагаем метки и строки для входных данных for n in range(0, 7): lab[n].grid(row=0, column=n, padx=5) ent[n].grid(row=1, column=n, padx=5) # создаем и располагаем метку и строку для выходных данных lab_ex = Label(root, text="конц нас-я MgO", font="Arial 12") ent_ex = Entry(root) lab_ex.grid(row=2, padx=5, pady=5) ent_ex.grid(row=3, padx=5, pady=5) # создаем и располагаем кнопки but1 = Button(root, text="метод 1", font="Arial 12") but2 = Button(root, text="метод 2", font="Arial 12") but1.grid(row=4, column=0, pady=5) but2.grid(row=4, column=1, pady=5) # события для кнопок и текстовых полей but1.bind("<Button-1>", metod_1) but2.bind("<Button-1>", metod_2) for n in range(0, 7): ent[n].bind("<FocusOut>", check_data) root.mainloop()