Вычисление не заданного значения в задаче на встречное движение
В методе 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 шт):
Пожалуйста, всегда предоставляете минимально-воспроизводимый пример.
Пожалуйста ознакомьтесь:
Как создать минимальный, самодостаточный и воспроизводимый пример.
Вопрос — ответ. Ничего лишнего.
Все ссылки очень важные и последняя также важна.
Я увидел ваша задачу так:
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()
Если будет что-то не понятно, спросите.

