OK, I'm pretty sure I got all of the bugs out:
Try and let me know what you think.
This could be simplified even more, but it would start to get cryptic if so.
Try and let me know what you think.
This could be simplified even more, but it would start to get cryptic if so.
import tkinter as tk from math import sqrt import sys class PythagoreanTheorem: def __init__(self, parent): self.parent = parent self.levelwidth = 400 self.levelheight = 80 self.levelxpos = 400 self.levelypos = 400 self.parent.title("Pythagorean Theorem Calculator") self.parent.geometry("400x80") self.parent.geometry(f"{self.levelwidth}x{self.levelheight}" \ f"+{self.levelxpos}+{self.levelypos}") self.name = None self.var_1 = tk.StringVar() self.var_2 = tk.StringVar() self.buttons = {} self.parent.withdraw() self.choice_frame = tk.Toplevel() handler = lambda: self.onCloseFrame(self.choice_frame, self.query_frame) self.add_choice_frame() self.query_frame = tk.Toplevel() handler = lambda: self.onCloseFrame(self.query_frame, self.results_frame) self.add_query_frame() self.query_frame.withdraw() self.results_frame = tk.Toplevel() handler = lambda: self.onCloseFrame(self.results_frame, self.choice_frame) self.add_results_frame() self.results_frame.withdraw() self.choice_frame.lift() def solve_equation(self, event, name): self.name = name self.e1.delete(0, 'end') self.e2.delete(0, 'end') if name == 'next': self.results_frame.withdraw() self.choice_frame.deiconify() elif name == 'A': self.choice_frame.withdraw() self.query_frame.deiconify() self.label_1.configure(text="Value of B:") self.label_2.configure(text="Value of C:") elif name == 'B': self.choice_frame.withdraw() self.query_frame.deiconify() self.label_1.configure(text="Value of A:") self.label_2.configure(text="Value of C:") elif name == 'C': self.choice_frame.withdraw() self.query_frame.deiconify() self.label_1.configure(text="Value of A:") self.label_2.configure(text="Value of B:") else: print(f"Unknown name {name}") sys.exit(-1) def onCloseFrame(self, oldframename): oldframename.withdraw() newframename.deconify() def add_choice_frame(self): self.choice_frame.title("Pythagorean Theorem Calculator") self.choice_frame.geometry(f"{self.levelwidth}x{self.levelheight}" \ f"+{self.levelxpos}+{self.levelypos}") self.choice_frame.protocol('WM_DELETE_WINDOW', self.quit) self.f1 = tk.Frame(self.choice_frame, width=400, height=40) self.f1.pack() welcome_label = tk.Label(self.f1, text="Welcome to the Pythagorean Theorem Calculator!", fg="blue") welcome_label.pack() solve_for = tk.Label(self.f1, text="Would you like to solve for A, B, or C?") solve_for.pack() self.f2 = tk.Frame(self.choice_frame, width=420, height=20) self.f2.pack() for name in ['A', 'B', 'C']: self.buttons[name] = {} self.buttons[name]['name'] = name self.buttons[name]['button'] = tk.Button(self.f2, fg="green", text=f"Solve for {name}") self.buttons[name]['button'].bind('<Button-1>', lambda event, bname=self.buttons[name]['name']: self.solve_equation(event, bname)) self.buttons[name]['button'].pack(side=tk.LEFT) def add_query_frame(self): self.query_frame.title("Pythagorean Theorem Calculator") self.query_frame.geometry(f"{self.levelwidth}x{self.levelheight}" \ f"+{self.levelxpos}+{self.levelypos}") self.query_frame.protocol('WM_DELETE_WINDOW', self.quit) self.label_1 = tk.Label(self.query_frame) self.label_2 = tk.Label(self.query_frame) self.e1 = tk.Entry(self.query_frame, textvariable=self.var_1) self.e2 = tk.Entry(self.query_frame, textvariable=self.var_2) self.submit_button = tk.Button(self.query_frame, text="Submit", fg="red", command=self.submit) self.label_1.grid(row=0, sticky='w') self.label_2.grid(row=1, sticky='w') self.e1.grid(row=0, column=1) self.e2.grid(row=1, column=1) self.submit_button.grid(row=2, column=1) def add_results_frame(self): self.results_frame.title("Pythagorean Theorem Calculator") self.results_frame.geometry(f"{self.levelwidth}x{self.levelheight}" \ f"+{self.levelxpos}+{self.levelypos}") self.query_frame.protocol('WM_DELETE_WINDOW', self.quit) self.result_label = tk.Label(self.results_frame) self.result_label.pack() self.next_button = tk.Button(self.results_frame, text="Next", fg="green") self.next_button.bind('<Button-1>', lambda event, bname=self.next_button: self.solve_equation(event, 'next')) self.next_button.pack(side=tk.LEFT) self.quit_button = tk.Button(self.results_frame, text="Quit", fg="red", command=quit) self.quit_button.pack(side=tk.LEFT) def submit(self): self.query_frame.withdraw() self.results_frame.deiconify() self.show_results() def show_results(self): name = self.name value1 = float(self.var_1.get()) value2 = float(self.var_2.get()) if name == 'C': result = sqrt((value1 ** 2) + (value2 ** 2)) else: result = sqrt((value1 ** 2) - (value2 ** 2)) self.result_label.configure(text = f"The value of {name} is: {str(result)}") def quit(self): self.parent.destroy() sys.exit(0) def main(): root = tk.Tk() pt = PythagoreanTheorem(root) root.mainloop() if __name__ == "__main__": main()You can get display dimensions using (so you can calculate display center):
from win32api import GetSystemMetrics Width = {GetSystemMetrics(0)} Height = {GetSystemMetrics(1)}EDIT 10:43 PM UTC fixed error in calculation