Найти - Пользователи
Полная версия: [Tkinter] Передать значение из одного окна в другое
Начало » GUI » [Tkinter] Передать значение из одного окна в другое
1
AoHeaven
Здраствутйе, прошу помощи. Есть первое окно и второе окно. В первом окне есть Combobox, есть 4 массива со списками. В другом окне есть 4 Radiobutton. Как отловить какой пункт был нажат во втором окне, чтобы в первом окне создать условие, какие должны списки загружаться в Combobox. Вот код:

 def create_window_triangle():
    def func_label_configure():
        if lb_formulas.current() == 0:
            l_field_1.config(text="Довжина сторони (у см)")
            l_field_2.config(text="Довжина висоти (у см)")
        elif lb_formulas.current() == 1:
            l_field_1.config(text="Довжина першої сторони (у см)")
            l_field_2.config(text="Довжина другої сторони (у см)")
            l_field_3.config(text="Довжина третьої сторони (у см)")
        elif lb_formulas.current() == 2:
            l_field_1.config(text="Довжина першої сторони (у см)")
            l_field_2.config(text="Довжина другої сторони (у см)")
            l_field_3.config(text="Кут (у градусах)")
        elif lb_formulas.current() == 3:
            l_field_1.config(text="Довжина першої сторони (у см)")
            l_field_2.config(text="Довжина другої сторони (у см)")
            l_field_3.config(text="Довжина третьої сторони (у см)")
            l_field_4.config(text="Радіус ОПИСАНОГО кола (у градусах)")
        elif lb_formulas.current() == 4:
            l_field_1.config(text="Довжина першої сторони (у см)")
            l_field_2.config(text="Довжина другої сторони (у см)")
            l_field_3.config(text="Довжина третьої сторони (у см)")
            l_field_4.config(text="Радіус ВПИСАНОГО кола (у градусах)")
        else:
            l_field_1.config(text="")
            l_field_2.config(text="")
            l_field_3.config(text="")
            l_field_4.config(text="")
    def lb_formulas_selected():
        if lb_formulas.current() == 0:
            l_title.config(text="Обрана формула \"{}\"".format(lb_formulas.get()))
            func_hide_sumbit()
            func_show_frm_1()
            func_show_frm_2()
            func_hide_frm_3()
            func_hide_frm_4()
            func_show_sumbit()
            func_show_clear()
            func_label_configure()
        elif lb_formulas.current() == 1:
            l_title.config(text="Обрана формула \"{}\"".format(lb_formulas.get()))
            func_hide_sumbit()
            func_show_frm_1()
            func_show_frm_2()
            func_show_frm_3()
            func_hide_frm_4()
            func_show_sumbit()
            func_show_clear()
        elif lb_formulas.current() == 2:
            l_title.config(text="Обрана формула \"{}\"".format(lb_formulas.get()))
            func_hide_sumbit()
            func_show_frm_1()
            func_show_frm_2()
            func_show_frm_3()
            func_hide_frm_4()
            func_show_sumbit()
        elif lb_formulas.current() == 3:
            l_title.config(text="Обрана формула \"{}\"".format(lb_formulas.get()))
            func_hide_sumbit()
            func_show_frm_1()
            func_show_frm_2()
            func_show_frm_3()
            func_show_frm_4()
            func_show_sumbit()
            func_show_clear()
        elif lb_formulas.current() == 4:
            l_title.config(text="Обрана формула \"{}\"".format(lb_formulas.get()))
            func_hide_sumbit()
            func_show_frm_1()
            func_show_frm_2()
            func_show_frm_3()
            func_show_frm_4()
            func_show_sumbit()
            func_show_clear()
        else:
            l_title.config(text="Спочатку оберіть формулу")
        func_label_configure()
    def func_clear():
        e_field_1.delete("0", tk.END)
        e_field_2.delete("0", tk.END)
        e_field_3.delete("0", tk.END)
        e_field_4.delete("0", tk.END)
        mb.showinfo("Очищення полів", "Поля очищенні успішно")
    def func_triangle_toplevel():
        def func_return_main():
            window_toplevel.destroy()
            window.deiconify()
            return wt_rb_state
        window.withdraw()
        window_toplevel = tk.Toplevel()
        window_toplevel.focus_force()
        wintl_width = window_toplevel.winfo_screenwidth()
        wintl_height = window_toplevel.winfo_screenheight()
        wintl_width = wintl_width // 2
        wintl_height = wintl_height // 2
        wintl_width = wintl_width - 150
        wintl_height = wintl_height - 200
        wt_rb_state = tk.IntVar()
        wt_rb_state.set(0)
        window_toplevel['bg'] = '#ffffff'
        window_toplevel.title("Тип трикутника")
        window_toplevel.geometry("300x400+{}+{}".format(wintl_width, wintl_height))
        window_toplevel.resizable(False, False)
        wt_l_title = tk.Label(window_toplevel, bg="#ffffff", font=14, text="Оберіть тип трикутника")
        wt_l_title.pack(pady=8)
        wt_rb_one = tk.Radiobutton(window_toplevel, anchor=tk.W, bg="#ffffff", text="Звичайний прямокутник", variable=wt_rb_state, value=0, width=35)
        wt_rb_one.pack(pady=8)
        wt_rb_two = tk.Radiobutton(window_toplevel, anchor=tk.W, bg="#ffffff", text="Прямокутний прямокутник", variable=wt_rb_state, value=1, width=35)
        wt_rb_two.pack(pady=8)
        wt_rb_three = tk.Radiobutton(window_toplevel, anchor=tk.W, bg="#ffffff", text="Рівнобедрений прямокутник", variable=wt_rb_state, value=2, width=35)
        wt_rb_three.pack(pady=8)
        wt_rb_four = tk.Radiobutton(window_toplevel, anchor=tk.W, bg="#ffffff", text="Рівносторонній прямокутник", variable=wt_rb_state, value=3, width=35)
        wt_rb_four.pack(pady=8)
        wt_btn_return = tk.Button(window_toplevel, text="ОК", command=func_return_main, width=10)
        wt_btn_return.place(x=212, y=365)
        window_toplevel.mainloop()
    def func_loading_formulas():
        global wt_rb_state
        if wt_rb_state == 0:
            lb_formulas.config(values=lb_formulas_type_1)
        elif wt_rb_state == 1:
            lb_formulas.config(values=lb_formulas_type_2)
        elif wt_rb_state == 2:
            lb_formulas.config(values=lb_formulas_type_3)
        elif wt_rb_state == 3:
            lb_formulas.config(values=lb_formulas_type_4)
        else:
            lb_formulas.config(values=lb_formulas_type_1)
    def func_hide_frm_1():
        frm_1.pack_forget()
    def func_show_frm_1():
        frm_1.pack()
    def func_hide_frm_2():
        frm_2.pack_forget()
    def func_show_frm_2():
        frm_2.pack()
    def func_hide_frm_3():
        frm_3.pack_forget()
    def func_show_frm_3():
        frm_3.pack()
    def func_hide_frm_4():
        frm_4.pack_forget()
    def func_show_frm_4():
        frm_4.pack()
    def func_hide_answer():
        l_answer.pack_forget()
    def func_show_answer():
        l_answer.pack()
    def func_hide_sumbit():
        btn_sumbit.pack_forget()
    def func_show_sumbit():
        btn_sumbit.pack()
    def func_hide_clear():
        btn_clear.place_forget()
    def func_show_clear():
        btn_clear.place(x=10, y=595)
    def func_window_main_return():
        window.destroy()
        create_window_main()
    def func_close_triangle_app():
        dialog_quit = mb.askyesno(title="Вихід", message="Вийти з програми?")
        if dialog_quit:
            window.destroy()
    window = tk.Tk()
    win_width = window.winfo_screenwidth()
    win_height = window.winfo_screenheight()
    win_width = win_width // 2
    win_height = win_height // 2
    win_width = win_width - 300  # Половина ширини вікна
    win_height = win_height - 350  # Половина висоти вікна
    window['bg'] = '#fafafa'
    window.title("Площа трикутника")
    window.geometry("600x640+{}+{}".format(win_width, win_height))
    window.resizable(False, False)
    lb_formulas_type_1 = ["За стороною і висотою",
                          "За трьома сторонами",
                          "За двома сторонами і кутом між ними",
                          "За трьома сторонами і радіусом ОПИСАНОГО кола",
                          "За трьома сторонами і радіусом ВПИСАНОГО кола"]
    lb_formulas_type_2 = ["Формула площі прямокутного трикутника"]
    lb_formulas_type_3 = ["За основою та бічною стороною",
                            "За двома бічними сторонами та кутом між ними",
                            "За основою, бічною стороною та кутом при вершині"]
    lb_formulas_type_4 = ["Через сторону та висоту", "Через сторону"]
    l_title = tk.Label(window, bg="#fafafa", font=24, text="Оберіть формулу", pady=15, anchor=tk.CENTER)
    l_title.pack()
    lb_formulas = ttk.Combobox(window, width=90, state="readonly")
    lb_formulas.pack(pady=4)
    func_loading_formulas()
    btn_sumbit_formula = tk.Button(window, text="Обрати", pady=3, width=79, command=lb_formulas_selected)
    btn_sumbit_formula.pack(pady=16)
    frm_1 = tk.Frame(window, bg="#fafafa", pady=16)
    frm_1.pack()
    l_field_1 = tk.Label(master=frm_1, bg="#fafafa", text="Мітка 1", pady=2, width=80, anchor=tk.W)
    l_field_1.pack()
    e_field_1 = tk.Entry(master=frm_1, borderwidth=2, width=92, relief=tk.SUNKEN)
    e_field_1.pack()
    frm_2 = tk.Frame(window, bg="#fafafa", pady=16)
    frm_2.pack()
    l_field_2 = tk.Label(master=frm_2, bg="#fafafa", text="Мітка 2", pady=2, width=80, anchor=tk.W)
    l_field_2.pack()
    e_field_2 = tk.Entry(master=frm_2, borderwidth=2, width=92, relief=tk.SUNKEN)
    e_field_2.pack()
    frm_3 = tk.Frame(window, bg="#fafafa", pady=16)
    frm_3.pack()
    l_field_3 = tk.Label(master=frm_3, bg="#fafafa", text="Мітка 3", pady=2, width=80, anchor=tk.W)
    l_field_3.pack()
    e_field_3 = tk.Entry(master=frm_3, borderwidth=2, width=92, relief=tk.SUNKEN)
    e_field_3.pack()
    frm_4 = tk.Frame(window, bg="#fafafa", pady=16)
    frm_4.pack()
    l_field_4 = tk.Label(master=frm_4, bg="#fafafa", text="Мітка 4", pady=2, width=80, anchor=tk.W)
    l_field_4.pack()
    e_field_4 = tk.Entry(master=frm_4, borderwidth=2, width=92, relief=tk.SUNKEN)
    e_field_4.pack()
    btn_sumbit = tk.Button(window, bg="#dbffcc", text="Обчислити", width=78, pady=3)
    btn_sumbit.pack(pady=30)
    l_answer = tk.Label(window, bg="#fafafa", text="Відповідь")
    l_answer.pack()
    btn_clear = tk.Button(window, text="Очистити поля", command=func_clear, pady=4)
    btn_clear.place(x=10, y=595)
    btn_type = tk.Button(window, text="Тип трикутника", pady=4, command=func_triangle_toplevel)
    btn_type.place(x=395, y=595)
    btn_return = tk.Button(window, text="Повернутися", command=func_window_main_return, pady=4)
    btn_return.place(x=505, y=595)
    func_hide_frm_1()
    func_hide_frm_2()
    func_hide_frm_3()
    func_hide_frm_4()
    func_hide_answer()
    func_hide_sumbit()
    func_hide_clear()
    window.protocol("WM_DELETE_WINDOW", func_close_triangle_app)
    window.mainloop()
AD0DE412
введите еще одну эээ сущность ну котороя будет следить за состоянием этих двух окон
в ткинтере есть для этого таймер
ну и вобще в питоне мультитединг и мультипроцесинг

зы по поводу вашего кода
мне кажтся что вам было бы удомней использовать классы
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB