проблема с GUI Кнопки, вызывающие функции, которые запрашивают пользовательский ввод в GUI, а затем отображают вывод - PullRequest
3 голосов
/ 28 апреля 2019

Я не могу получить пользовательский ввод в GUI


from tkinter import *
from tkinter import ttk
import math


1 Ответ

1 голос
/ 28 апреля 2019

Я создаю основной кадр с кнопками 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...