Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+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()
По дате
По рейтингу
Аватар пользователя
Оракул
1мес
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()