Вычисление не заданного значения в задаче на встречное движение

В методе btn1_click() расписано окно с графическим интерфейсом и в нём есть четыре поля ввода,
а в методе cnt1() должны производится вычисления по нахождению неизвестной переменной (пропуск или x в поле заполнения).
Как это сделать?

Просто когда я пытался делать это сам, то оно либо не считалось, либо не признавала существования переменных.
К слову, это задачи на встречное движение.

...

    def btn1_click(self):
        if self.btn1_count > 0:
            return
        self.wnd1 = CTk.CTkToplevel()
        self.wnd1.title("Дополнительное окно 1")
        self.wnd1.geometry('450x200')
        self.wnd1.resizable(False, False)
        self.wnd1.protocol("WM_DELETE_WINDOW", self.on_close1)

        data_label = CTk.CTkLabel(self.wnd1, text="Введите данные", font=('Arial', 15, 'bold'))
        data_label.grid(row=0, column=0, pady=(10, 5), padx=(10, 0), sticky='w')

        self.sA = CTk.StringVar()  # скорость машины из А
        self.sB = CTk.StringVar()  # скорость машины из Б
        self.time = CTk.StringVar()  # время через которое они встретились
        self.za = CTk.StringVar()  # расстояние(которое они проехали вместе)

        entry_vars = [self.sA, self.sB, self.time, self.za]

        labels = ["Скорость из А:", "Скорость из Б:", "Время:", "Расстояние:"]
        for i, label_text in enumerate(labels):
            label = CTk.CTkLabel(self.wnd1, text=label_text, font=('Arial', 10))
            label.grid(row=i + 1, column=0, pady=(5, 0), padx=(10, 0), sticky='w')

            entry = CTk.CTkEntry(self.wnd1, textvariable=entry_vars[i], state=CTk.NORMAL)
            entry.grid(row=i + 1, column=1, pady=(5, 0), padx=(0, 10), sticky='e')

        countb1 = CTk.CTkButton(self.wnd1, text="Расчитать", width=40, command=self.cnt1)
        countb1.grid(row=1, column=3, rowspan=len(labels), padx=(50, 10), pady=(0, 0))

        self.btn1_count += 1

    def cnt1(self):
        pass

...

Ответы (1 шт):

Автор решения: S. Nick

Пожалуйста, всегда предоставляете минимально-воспроизводимый пример.

Пожалуйста ознакомьтесь:

Как задавать хорошие вопросы.

Как создать минимальный, самодостаточный и воспроизводимый пример.

Вопрос — ответ. Ничего лишнего.

Все ссылки очень важные и последняя также важна.


Я увидел ваша задачу так:

from tkinter import *
import customtkinter as CTk


class ToplevelWindow(CTk.CTkToplevel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.title("Дополнительное окно 1")
        self.geometry('450x200+700+400')
        self.resizable(False, False)

        self.data_label = CTk.CTkLabel(self, 
            text="Введите данные", 
            font=('Arial', 15, 'bold'))
        self.data_label.grid(row=0, column=0, 
            pady=(10, 5), padx=(10, 0), sticky='w')        
        self.attributes("-topmost", True)        


class App(Tk):
    def __init__(self):
        super(App, self).__init__()
        self.title("Решатель задач 2999")
        self.geometry('600x400+400+100')
        self.resizable(0, 0)
        self.canvas = Canvas(self, height=600, width=400)
        self.canvas.pack()

        self.frame = Frame(self, bg='white')
        self.frame.place(relx=0, rely=0, relwidth=1, relheight=1)

#?       self.btn1_count = 0

        title = Label(self.frame, text='Выберите вариант', bg='white')
        title.pack()
        
        self.btn1 = Button(self.frame, text='Встречное движение', 
            bg='gray', font=50, command=self.btn1_click)
        self.btn1.pack(side=LEFT, padx=50)
        
        self.btn2 = Button(self.frame, text='Попутное движение', 
            bg='gray', font=50, command=self.btn2_click)
        self.btn2.pack(side=RIGHT, padx=50)
        
        self.wnd1 = None                                             # +
        
    def btn1_click(self):
#?       if self.btn1_count > 0: return

        if self.wnd1 is None or not self.wnd1.winfo_exists():        # +
            self.wnd1 = ToplevelWindow(self)                         # +
            self.wnd1.protocol("WM_DELETE_WINDOW", self.on_close1)   # +
            self.sA = CTk.StringVar()    # скорость машины из А
            self.sB = CTk.StringVar()    # скорость машины из Б
            self.time = CTk.StringVar()  # время до встречи
            self.za = CTk.StringVar()    # расстояние от А до Б)

            entry_vars = [self.sA, self.sB, self.time, self.za]

            labels = ["Скорость из А:", "Скорость из Б:", 
                "Время:", "Расстояние:"]
            for i, label_text in enumerate(labels):
                label = CTk.CTkLabel(self.wnd1, text=label_text, 
                    font=('Arial', 10))
                label.grid(row=i + 1, column=0, 
                    pady=(5, 0), padx=(10, 0), sticky='w')

                entry = CTk.CTkEntry(self.wnd1, 
                    textvariable=entry_vars[i], state=CTk.NORMAL)
                entry.grid(row=i + 1, column=1, 
                    pady=(5, 0), padx=(0, 10), sticky='e')

            countb1 = CTk.CTkButton(self.wnd1, text="Расчитать", 
                width=40, command=self.cnt1)
            countb1.grid(row=1, column=3, rowspan=len(labels), 
                padx=(50, 10), pady=(0, 0))

#?           self.btn1_count += 1

        else:                                                        # +
            self.wnd1.focus()                                        # +                
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def cnt1(self):                                                  # +
        sA = self.sA.get()
        sB = self.sB.get()
        _time = self.time.get()
        za = self.za.get()
        
        try:
            if (sA and sA != 'x') and (sB and sB != 'x') \
                                  and (_time and _time != 'x'):
                sA = float(sA)
                sB = float(sB)
                _time = float(_time)
                za = (sA * _time) + (sB * _time)
                print(f'Расстояние = {za:.2f} ') 
            elif (sA and sA != 'x') and (sB and sB != 'x') and za \
                and ((not _time) or _time == 'x'):
                sA = float(sA)
                sB = float(sB)
                za = float(za)
                _time = (za / (sA + sB))         
                print(f'Время = {_time}')            
            elif (sA and sA != 'x') and \
                (_time and _time != 'x') and (za and za != 'x'):
                sA = float(sA)
                _time = float(_time)
                za = float(za)
                sB = (za - (sA * _time)) / _time
                print(f'Скорость B = {sB} ') 
            elif (sB and sB != 'x') and \
                (_time and _time != 'x') and (za and za != 'x'):
                sB = float(sB)
                _time = float(_time)
                za = float(za)
                sA = (za - (sB * _time)) / _time
                print(f'Скорость A = {sA} ') #  
            else:   
                print(f'Что-то пошло не так. Проверьте исходные данные.\n') #  
            
        except Exception as e:
             print(f'Что-то пошло не так. Проверьте исходные данные.\n{e}\n') # 

    def on_close1(self):        
        self.wnd1.destroy()

    def btn2_click(self):
        pass
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        

def main():
   app = App()
   app.mainloop()

if __name__ == '__main__':
    main()

введите сюда описание изображения

введите сюда описание изображения


Если будет что-то не понятно, спросите.

→ Ссылка