1мес



Программирование
+2Помогите Tkinter, python
Помогите мне нужно сделать так, чтобы после нажатия на кнопку выполнялись два def по порядку начиная с (pr1), но если у (pr1) выскакивает ошибка и пока пользователь ее не исправит, то (summa2) не будет выполняться, а если все хорошо то после (pr1) выполнялась (summa2).Я попробовал через lambda, но получилось не так как надо
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
import tkinter as tk
from tkinter import messagebox
from tkinter import font
window = tk.Tk()
window.title("Рассчет квартплаты")
window.geometry("1205x550")
custom_font=font.Font(family="Arial Black",size=11)
custom_font_entry=font.Font(family="Arial Black",size=10)
ramka=tk.Frame(relief=tk.SUNKEN,borderwidth=4,bg="white")
ramka.grid(row=0,column=0)
svet=tk.Label(master=ramka,text="Введите показатели счетчика света прошлого месяца:",bg="white",font=custom_font)
svet1=tk.Entry(master=ramka,width=40,relief=tk.SUNKEN,borderwidth=2,bg="yellow",font=custom_font_entry)
svet.grid(row=0,column=0,sticky="w")
svet1.grid(row=0,column=1)
svet2=tk.Label(master=ramka,text="Введите показания счетчика света за текущий месяц:",bg="white",font=custom_font)
svet3=tk.Entry(master=ramka,width=40,relief=tk.SUNKEN,borderwidth=2,bg="yellow",font=custom_font_entry)
svet2.grid(row=1,column=0,sticky="w")
svet3.grid(row=1,column=1)
svet_tar=tk.Label(master=ramka,text="Введите ваш тариф за свет:",bg="white",font=custom_font)
svet_tar1=tk.Entry(master=ramka,width=40,relief=tk.SUNKEN,borderwidth=2,bg="yellow",font=custom_font_entry)
svet_tar.grid(row=2,column=0,sticky="e",pady=7)
svet_tar1.grid(row=2,column=1)
summa=tk.Label(master=ramka,text="Итого сумма оплаты составляет(руб):",bg="white",font=custom_font)
summa1=tk.Entry(master=ramka,width=40,relief=tk.SUNKEN,borderwidth=2,bg="yellow",font=custom_font_entry)
summa.grid(row=16,column=0,sticky="e",pady=10)
summa1.grid(row=16,column=1)
knopka2=tk.Button(master=ramka,text="Посчитать сумму оплаты",bg="yellow",command=lambda:[pr1(), summa2()],font=custom_font)
knopka2.grid(row=16,column=2,padx=15)
def summa2():
try:
a = float(svet1.get())
a1 = float(svet3.get())
a3 = float(svet_tar1.get())
except ValueError:
messagebox.showerror("Ошибка ввода","Вы заполнили не все поля или ввели что-то другое вместо цифр,проверьте введенные вами данные и попробуйте снова.")
else:
summa1.delete(0, 'end')
summa1.insert(0,"{} рублей".format((a1-a)*a3))
return
def pr1():
if svet1.get() > svet3.get():
messagebox.showerror("Ошибка ввода","Показания счетчиков за прошлый месяц не могут быть больше показания счетчиков за текущий месяц,проверьте данные ввода.")
else:
return
window.mainloop()
По дате
По рейтингу
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
import tkinter as tk
from tkinter import messagebox
from tkinter import font
# --- Функция-обработчик, которая будет вызываться кнопкой ---
def handle_calculation():
"""
Главная функция, которая управляет проверкой и расчетом.
"""
# Сначала выполняем проверку данных.
# Если проверка не пройдена (pr1 вернула False), выходим из функции.
if not pr1():
return # Прерываем выполнение, если pr1 нашла ошибку
# Если проверка пройдена, выполняем расчет.
summa2()
# --- Функция проверки (валидации) данных ---
def pr1():
"""
Проверяет корректность введенных показаний счетчиков.
Возвращает True, если все в порядке, и False, если есть ошибка.
"""
try:
# Получаем значения и сразу преобразуем их в числа для сравнения
prev_month_val = float(svet1.get())
current_month_val = float(svet3.get())
except ValueError:
# Эта ошибка будет обработана в summa2, но для pr1 важно, что
# если поля пустые, то и сравнивать нечего, считаем это "успехом" для этой проверки
return True # Позволяем summa2 обработать ошибку пустых полей
if prev_month_val > current_month_val:
messagebox.showerror("Ошибка ввода", "Показания счетчиков за прошлый месяц не могут быть больше показаний за текущий месяц. Проверьте данные ввода.")
return False # Сигнализируем об ошибке
else:
return True # Сигнализируем, что все в порядке
# --- Функция расчета ---
def summa2():
"""
Рассчитывает и выводит итоговую сумму.
"""
try:
# Получаем все значения для расчета
a = float(svet1.get())
a1 = float(svet3.get())
a3 = float(svet_tar1.get())
except ValueError:
messagebox.showerror("Ошибка ввода", "Вы заполнили не все поля или ввели что-то другое вместо цифр. Проверьте введенные вами данные и попробуйте снова.")
else:
# Рассчитываем сумму
result = (a1 - a) * a3
# Очищаем поле вывода и вставляем новый результат
summa1.delete(0, 'end')
# f-строка для форматирования с 2 знаками после запятой - хороший тон
summa1.insert(0, f"{result:.2f} рублей")
# --- Настройка интерфейса (ваш код без изменений, кроме команды кнопки) ---
window = tk.Tk()
window.title("Рассчет квартплаты")
window.geometry("1205x550")
custom_font = font.Font(family="Arial Black", size=11)
custom_font_entry = font.Font(family="Arial Black", size=10)
ramka = tk.Frame(relief=tk.SUNKEN, borderwidth=4, bg="white")
ramka.grid(row=0, column=0)
svet = tk.Label(master=ramka, text="Введите показатели счетчика света прошлого месяца:", bg="white", font=custom_font)
svet1 = tk.Entry(master=ramka, width=40, relief=tk.SUNKEN, borderwidth=2, bg="yellow", font=custom_font_entry)
svet.grid(row=0, column=0, sticky="w")
svet1.grid(row=0, column=1)
svet2 = tk.Label(master=ramka, text="Введите показания счетчика света за текущий месяц:", bg="white", font=custom_font)
svet3 = tk.Entry(master=ramka, width=40, relief=tk.SUNKEN, borderwidth=2, bg="yellow", font=custom_font_entry)
svet2.grid(row=1, column=0, sticky="w")
svet3.grid(row=1, column=1)
svet_tar = tk.Label(master=ramka, text="Введите ваш тариф за свет:", bg="white", font=custom_font)
svet_tar1 = tk.Entry(master=ramka, width=40, relief=tk.SUNKEN, borderwidth=2, bg="yellow", font=custom_font_entry)
svet_tar.grid(row=2, column=0, sticky="e", pady=7)
svet_tar1.grid(row=2, column=1)
summa = tk.Label(master=ramka, text="Итого сумма оплаты составляет(руб):", bg="white", font=custom_font)
summa1 = tk.Entry(master=ramka, width=40, relief=tk.SUNKEN, borderwidth=2, bg="yellow", font=custom_font_entry)
summa.grid(row=16, column=0, sticky="e", pady=10)
summa1.grid(row=16, column=1)
# !!! ГЛАВНОЕ ИЗМЕНЕНИЕ ЗДЕСЬ !!!
# Теперь кнопка вызывает одну функцию-обработчик handle_calculation
knopka2 = tk.Button(master=ramka, text="Посчитать сумму оплаты", bg="yellow", command=handle_calculation, font=custom_font)
knopka2.grid(row=16, column=2, padx=15)
window.mainloop()