Я создаю основной кадр с кнопками Rectangle
, Triangle
и использую pack()
, чтобы показать его.
Я также создаю два кадра с Entry
, но я не использую pack()
, чтобы показать его.
Когда я нажимаю Rectangle
или Triangle
, он запускает функцию, которая использует pack_forget()
для удаления основного кадра из окна, и использует .pack()
two show one of frame с Entry
.
В этом кадре есть кнопка Calc
, которая использует вашу функцию для вычисления результата - но она получает значения из Entry и отображает результат в метке.
Также имеется кнопка Back
, которая удаляет этот кадр и снова показывает основной кадр.
Я использую current
, чтобы запомнить текущий видимый кадр.
from tkinter import *
from tkinter import ttk
import math
# ---
def change_frame(new_frame):
global current
# hide current frame
current.pack_forget()
# show new frame
current = new_frame
current.pack()
def show_main_frame():
change_frame(main_frame)
def show_rectangle_frame():
change_frame(rectangle_frame)
def show_triangle_frame():
change_frame(triangle_frame)
# ---
def calc_rectangle():
try:
l = float(rectangle_entry1.get())
w = float(rectangle_entry2.get())
arear=(l * w)
print(arear)
rectangle_result['text'] = str(arear)
except ValueError:
pass
def calc_triangle():
try:
b = float(triangle_entry1.get())
h = float(triangle_entry2.get())
areat=(0.5* b * h )
print(areat)
triangle_result['text'] = str(areat)
except ValueError:
pass
#-----
window = Tk()
window.title("Area Calculator")
#window.geometry("290x120")
main_frame = Frame(window)
main_frame.pack()
button = Button(main_frame, text="Rectangle", command=show_rectangle_frame)
button.pack()
button = Button(main_frame, text="Triangle", command=show_triangle_frame)
button.pack()
current = main_frame
# --- frame without .pack() ---
rectangle_frame = Frame(window)
rectangle_result = Label(rectangle_frame, text="")
rectangle_result.pack()
l = Label(rectangle_frame, text="Enter Length:")
l.pack()
rectangle_entry1 = Entry(rectangle_frame)
rectangle_entry1.pack()
l = Label(rectangle_frame, text="Enter Width:")
l.pack()
rectangle_entry2 = Entry(rectangle_frame)
rectangle_entry2.pack()
b = Button(rectangle_frame, text="Calc", command=calc_rectangle)
b.pack()
b = Button(rectangle_frame, text="BACK", command=show_main_frame)
b.pack()
# --- frame without .pack() ---
triangle_frame = Frame(window)
triangle_result = Label(triangle_frame, text="")
triangle_result.pack()
l = Label(triangle_frame, text="Enter base:")
l.pack()
triangle_entry1 = Entry(triangle_frame)
triangle_entry1.pack()
l = Label(triangle_frame, text="Enter Height:")
l.pack()
triangle_entry2 = Entry(triangle_frame)
triangle_entry2.pack()
b = Button(triangle_frame, text="Calc", command=calc_triangle)
b.pack()
b = Button(triangle_frame, text="BACK", command=show_main_frame)
b.pack()
# ---
window.mainloop()
Используя lambda
вы можете сделать
command=lambda:change_frame(rectanlge_frame)
и тогда вам не нужна функция show_rectanlge_frame
То же самое со вторым кадром.
Существует более сложная версия, созданная Брайаном Оукли, которая использует классы Page(Frame)
, и иногда вы можете увидеть эти классы в вопросах о Stackoverflow.