Dynamiczne formularze dodawania figur geometrycznych

0

mam taki kod to jest kalkulator pól i obwodów figur
zależy mi na tym żeby po wybraniu figury i operacji wyświetlała się tylko ta wymagana liczba rubryk do wpisywania wartości jaka musi być nic mniej i nic więcej żeby była perfekcyjna liczba

import tkinter as tk
from tkinter import font
import math

selected_figure = ""
selected_operation = ""
value_entries = []

def select_figure(figure):
    global selected_figure
    selected_figure = figure
    update_value_entries()
    show_page(2)

def select_operation(operation):
    global selected_operation
    selected_operation = operation
    show_page(3)

def update_value_entries():
    for entry in value_entries:
        entry.pack_forget()
        entry.destroy()
    value_entries.clear()

    num_values = get_num_values()

    for i in range(num_values):
        label_text = f"Wartość {i+1}:"
        entry = create_value_entry(label_text)
        value_entries.append(entry)

def create_value_entry(label_text):
    label = tk.Label(page3, text=label_text, font=default_font)
    label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    entry = tk.Entry(page3, font=default_font)
    entry.pack(fill=tk.BOTH, expand=True)
    return entry

def get_num_values():
    if selected_figure == "Kwadrat":
        return 1
    elif selected_figure in ["Prostokąt", "Równoległobok", "Romb"]:
        return 2
    elif selected_figure in ["Trójkąt", "Trapez"]:
        if selected_operation == "Pole":
            return 3
        else:
            return 2
    elif selected_figure == "Koło":
        return 1
    else:
        return 0

def calculate_result():
    num_values = get_num_values()
    values = []

    for i in range(num_values):
        value = value_entries[i].get()
        try:
            value = float(value)
            values.append(value)
        except ValueError:
            result_label.config(text="Błąd: Wprowadź poprawne wartości.")
            return

    if selected_figure == "Kwadrat":
        if selected_operation == "Pole":
            result = values[0] ** 2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            result = values[0] * 4
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Prostokąt" or selected_figure == "Równoległobok":
        value2_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        value2_entry.pack(fill=tk.BOTH, expand=True)

    elif selected_figure == "Trójkąt":
        value2_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        value2_entry.pack(fill=tk.BOTH, expand=True)
        if selected_operation == "Pole":
            value3_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            value3_entry.pack(fill=tk.BOTH, expand=True)
        else:
            value3_label.pack_forget()
            value3_entry.pack_forget()

    elif selected_figure == "Romb":
        value2_label.pack_forget()
        value2_entry.pack_forget()

    elif selected_figure == "Trapez":
        value2_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
        value2_entry.pack(fill=tk.BOTH, expand=True)
        if selected_operation == "Pole":
            value3_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            value3_entry.pack(fill=tk.BOTH, expand=True)
            value4_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
            value4_entry.pack(fill=tk.BOTH, expand=True)
        else:
            value3_label.pack_forget()
            value3_entry.pack_forget()
            value4_label.pack_forget()
            value4_entry.pack_forget()

    elif selected_figure == "Koło":
        value2_label.pack_forget()
        value2_entry.pack_forget()

def calculate_result():
    value = float(value_entry.get())

    if selected_figure == "Kwadrat":
        if selected_operation == "Pole":
            result = value ** 2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            result = value * 4
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Prostokąt":
        if selected_operation == "Pole":
            value2 = float(value2_entry.get())
            result = value * value2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            value2 = float(value2_entry.get())
            result = 2 * (value + value2)
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Trójkąt":
        if selected_operation == "Pole":
            value2 = float(value2_entry.get())
            result = 0.5 * value * value2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            value2 = float(value2_entry.get())
            value3 = float(value3_entry.get())
            result = value + value2 + value3
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Równoległobok":
        if selected_operation == "Pole":
            value2 = float(value2_entry.get())
            result = value * value2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            value2 = float(value2_entry.get())
            result = 2 * (value + value2)
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Romb":
        if selected_operation == "Pole":
            value2 = float(value2_entry.get())
            result = value * value2 / 2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            result = 4 * value
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Trapez":
        if selected_operation == "Pole":
            value2 = float(value2_entry.get())
            value3 = float(value3_entry.get())
            result = ((value + value2) * value3) / 2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            value2 = float(value2_entry.get())
            value3 = float(value3_entry.get())
            value4 = float(value4_entry.get())
            result = value + value2 + value3 + value4
            result_label.config(text=f"Obwód: {result}")

    elif selected_figure == "Koło":
        if selected_operation == "Pole":
            result = math.pi * value ** 2
            result_label.config(text=f"Pole: {result}")
        elif selected_operation == "Obwód":
            result = 2 * math.pi * value
            result_label.config(text=f"Obwód: {result}")

def show_page(page_number):
    page1.pack_forget()
    page2.pack_forget()
    page3.pack_forget()

    if page_number == 1:
        page1.pack(fill=tk.BOTH, expand=True)
    elif page_number == 2:
        page2.pack(fill=tk.BOTH, expand=True)
    elif page_number == 3:
        page3.pack(fill=tk.BOTH, expand=True)

def go_back(event=None):
    if page3.winfo_ismapped():
        show_page(2)
    elif page2.winfo_ismapped():
        show_page(1)

# Pasek Tytułowy
root = tk.Tk()
root.title("PyCalc")
root.iconbitmap(r"Wpiszę tutaj coś spokojnie :)")

# Okienko
window_width = 400
window_height = 400
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x_position = (screen_width - window_width) // 2
y_position = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x_position}+{y_position}")

# Czcionka
default_font = font.Font()
button_font = default_font.copy()
button_font.configure(size=int(round(float(button_font.cget("size")) * 1.3)))

# Strony
page1 = tk.Frame(root)
page2 = tk.Frame(root)
page3 = tk.Frame(root)

# Strona 1 Figury
default_label_font = default_font.copy()
default_label_font.configure(size=int(round(float(default_label_font.cget("size")) * 1.8)))
label = tk.Label(page1, text="Wybierz figurę", font=default_label_font)
label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

figures = ["Kwadrat", "Prostokąt", "Trójkąt", "Równoległobok", "Romb", "Trapez", "Koło"]
buttons_page1 = []
for figure in figures:
    button = tk.Button(page1, text=figure, font=button_font, command=lambda f=figure: select_figure(f))
    button.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    buttons_page1.append(button)

# Strona 2 Operacja
label = tk.Label(page2, text="Wybierz operację", font=default_label_font)
label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

operations = ["Pole", "Obwód"]
buttons_page2 = []
for operation in operations:
    button = tk.Button(page2, text=operation, font=button_font, command=lambda o=operation: select_operation(o))
    button.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
    buttons_page2.append(button)

# Strona 3 Wartości
label = tk.Label(page3, text="Podaj wartości", font=default_label_font)
label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

value_label = tk.Label(page3, text="Wartość 1:", font=default_font)
value_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
value_entry = tk.Entry(page3, font=default_font)
value_entry.pack(fill=tk.BOTH, expand=True)

value2_label = tk.Label(page3, text="Wartość 2:", font=default_font)
value3_label = tk.Label(page3, text="Wartość 3:", font=default_font)
value4_label = tk.Label(page3, text="Wartość 4:", font=default_font)

value2_entry = tk.Entry(page3, font=default_font)
value3_entry = tk.Entry(page3, font=default_font)
value4_entry = tk.Entry(page3, font=default_font)

result_button = tk.Button(page3, text="Oblicz", font=button_font, command=calculate_result)
result_button.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

result_label = tk.Label(page3, text="", font=default_font)
result_label.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

root.bind("<Escape>", go_back)

# Wyświetlanie strony 1
show_page(1)

# Uruchomienie aplikacji
root.mainloop()
1

Po wybraniu operacji musisz na podstawie wybranej operacji i wcześniej wybranej figury zdecydować jakie pola dla wartości będą pokazane. (użyj if)

Mało tego. Pola wartości możesz odpowiednio ponazywać!
Zamiast "Wartość 1", "Wartość 2", te pola mogą się pokazywać jako "bok a", "bok b", "promień r"...

0

a mógłbyś bardziej wytłumaczyć?
np na podstawie kodu mi pokazać co gdzie napisać
itp bo nie rozumiem tego

0

Niestety nie ma drogi na skróty. Musisz zacząć naukę od podstaw, żeby podołać temu zadaniu. Najpierw napisz sobie jedno okienko z przyciskiem, który coś robi. Potem dodawaj kolejne elementy - listy rozwijane, pola edycji itd. Jak się nauczysz jak działa Tk, to napiszesz własną aplikację, zamiast przerabiać tego gotowca...

1 użytkowników online, w tym zalogowanych: 0, gości: 1