KLYSTRON
@KLYSTRON
Врач-сердечно-сосудистый хирург

Как реализовать переходы между фреймами?

Имеется небольшая тестовая программа, по своей сути набросок будущего опросника, основанная на фреймах. В тестовом варианте есть три фрейма, кнопки длаее и назад.
Как по задумке это должно работать: каждый фрейм будет включать в себя вопрос (в виде label-метки с текстом) и ответ (в виде combobox с вариантами ответов). Пользователь выбирает вариант ответа -> нажимает кнопку далее -> в зависимости от варианта ответа появляется нужный фрейм. Соответственно при нажатии на кнопку назад происходит откат к фрейму с вопросом, с которого пользователь перешел на вопрос от которого откатился назад.
Как можно реализовать такой механизм переходов?

Код тестового приложения:
from tkinter import *
from tkinter import ttk
import tkinter as tk
from tkinter import Tk, RIGHT, BOTH, GROOVE, FLAT
from tkinter.ttk import Frame, Button, Style

app = tk.Tk()
width = 800
height = 600
x = int((app.winfo_screenwidth() / 2) - (width / 2))
y = int((app.winfo_screenheight() / 2) - (height / 2))
app.geometry(f'{width}x{height}+{x}+{y}')
app.resizable(width=False, height=False)

mine_frame = Frame(app, relief=GROOVE, borderwidth=1)
mine_frame.pack(fill=BOTH, expand=True, padx=88, pady=100)

def fwd_frame():
    value_0 = slt_value_0.get()
    if value_0 == '1':
        value_1()
    if value_0 == '2':
        value_2()

def value_1():
    value_0_frame.forget()
    value_2_frame.forget()

def value_2():
    value_1_frame.forget()
    value_0_frame.forget()

#----------------------------------------------------------------------------------------------FRAME 0
value_0_frame = Frame(mine_frame, relief=FLAT, borderwidth=1)
value_0_frame.pack(fill=BOTH, expand=True, padx=200, pady=150)
lbl_value_0 = tk.Label(value_0_frame, text='Select value 1:', font=('Tahoma', 8), justify='left',
                    foreground='#ffffff', background='#5050A1')
lbl_value_0.pack(padx=2, pady=10)
slt_value_0 = ttk.Combobox(value_0_frame, values=['1', '2'])
slt_value_0.pack(padx=2, pady=10)

#----------------------------------------------------------------------------------------------FRAME 1
value_1_frame = Frame(mine_frame, relief=FLAT, borderwidth=1)
value_1_frame.pack(fill=BOTH, expand=True, padx=200, pady=150)
lbl_value_1 = tk.Label(value_1_frame, text='Select value 2:', font=('Tahoma', 8), justify='left',
                    foreground='#ffffff', background='#5050A1')
lbl_value_1.pack(padx=2, pady=10)
slt_value_1 = ttk.Combobox(value_1_frame, values=['2', '3'])
slt_value_1.pack(padx=2, pady=10)

#----------------------------------------------------------------------------------------------FRAME 2
value_2_frame = Frame(mine_frame, relief=FLAT, borderwidth=1)
value_2_frame.pack(fill=BOTH, expand=True, padx=200, pady=150)
lbl_value_2 = tk.Label(value_2_frame, text='Select value 3:', font=('Tahoma', 8), justify='left',
                    foreground='#ffffff', background='#5050A1')
lbl_value_2.pack(padx=2, pady=10)
slt_value_2 = ttk.Combobox(value_2_frame, values=['3', '4'])
slt_value_2.pack(padx=2, pady=10)

#----------------------------------------------------------------------------------------------BUTTONS
btn_01 = ttk.Button(app, text='>', command=fwd_frame)
btn_01.place(x=710, y=299, height=401, width=80, anchor='w')

btn_02 = ttk.Button(app, text='<')
btn_02.place(x=10, y=299, height=401, width=80, anchor='w')

app.mainloop()
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
KLYSTRON
@KLYSTRON Автор вопроса
Врач-сердечно-сосудистый хирург
Проблема решена путем создания таких фреймов:
# -------------------------------------------------------------------------FRAME 1
def vl_1():
    mine_frame_1 = Frame(app, relief=GROOVE, borderwidth=1)
    mine_frame_1.pack(fill=BOTH, expand=True, padx=1, pady=1)

    def fwd_1():
        value_1 = slt_value_1.get()
        if value_1 == '3':
            mine_frame_1.forget()
            vl_3()
        if value_1 == '4':
            mine_frame_1.forget()
            vl_4()

    btn_fwd_1 = ttk.Button(mine_frame_1, text='>', command=fwd_1)
    btn_fwd_1.pack(fill='y', side='right')

    def bwd_1():
        mine_frame_1.forget()
        vl_0()

    btn_bwd_1 = ttk.Button(mine_frame_1, text='<', command=bwd_1)
    btn_bwd_1.pack(fill='y', side='left')

    value_1_frame = Frame(mine_frame_1, relief=FLAT, borderwidth=1)
    value_1_frame.pack(fill=BOTH, expand=True, padx=1, pady=60)
    lbl_value_1 = tk.Label(value_1_frame, text='Value 1:')
    lbl_value_1.pack(padx=1, pady=1)
    slt_value_1 = ttk.Combobox(value_1_frame, values=['3', '4'])
    slt_value_1.pack(padx=1, pady=1)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы