Tkinter Блокнот: Активировать кнопку на Вкладке 1 из Вкладки 2

Вопрос или проблема

На вкладке 1 у меня есть кнопка “Тест”, которую можно “включить”, нажав на кнопку “Тест” или нажав на кнопку “активации”. С вкладки 2 я хочу нажать “кнопку активации на вкладке 1” и чтобы кнопка “Тест” на вкладке 1 “включилась” и показала зеленое состояние ВКЛ. Если я уберу “Блокнот” и все будет на одной странице, это будет работать, но когда у меня есть две вкладки, я не могу показать кнопку “Тест” в состоянии ВКЛ, активируя ее с вкладки 2.

 #!/usr/bin/python3.9
    
import tkinter as tk
from tkinter import ttk
    
class MainFrame(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)

    
        self.labelA = ttk.Label(self, text = "Это MainFrame")
        self.labelA.grid(column=1, row=1, padx = 30, pady = 30)
    
        self.buttonA = tk.Button(self, text="тест", command=self.button)
        self.buttonA.grid(column=1, row=2, pady=20)
        self.buttonA.config(relief="raised", bg="gray", font="Helvetica 14", width="4", height="1", bd='8')

        self.buttonB = tk.Button(self, text="кнопка активации", command=self.button)
        self.buttonB.grid(column=1, row=3)

    def button(self):

        if self.buttonA.config('relief')[-1] == 'raised':
            self.buttonA.config(relief="sunken", text="ВКЛ", bg='green', font="Helvetica 14",  width="4", height="1", bd='8')

        else:
            self.buttonA.config(relief="raised", text="тест", bg="gray", font="Helvetica 14", width="4", height="1")
               
class SubFrame(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)       
    
        self.labelB = ttk.Label(self, text = "Это SubFrame")
        self.labelB.grid(column=1, row=2, padx = 30, pady = 30)
    
        self.buttonB = tk.Button(self, text="кнопка активации на вкладке 1", command=self.test) #Converter.mtest)
        self.buttonB.grid(column=1, row=3, padx=40)

    def test(self):
        mFrame.button() 
    
class App(tk.Tk):
     def __init__(self):
        super().__init__()
    
        self.geometry('800x500')
        #self.resizable(False, False)
        self.title("ВКЛАДКИ")

        self.notebook = ttk.Notebook(self)

        self.Frame1 = MainFrame(self.notebook)
        self.Frame2 = SubFrame(self.notebook)

        self.notebook.add(self.Frame1, text="ВКЛАДКА 1")
        self.notebook.add(self.Frame2, text="ВКЛАДКА 2")

        self.notebook.pack(expand = 1, fill ="both")

    
if __name__ == '__main__':
        
    app = App()

    mFrame=MainFrame(app)
    sFrame=SubFrame(app)
        
    app.mainloop()

Ответ или решение

Для решения вашей задачи, связанной с активированием кнопки на первой вкладке (Tab1) из второй вкладки (Tab2) в Tkinter с использованием компонента Notebook, необходимо обеспечить доступ к методу, который изменяет состояние кнопки на первой вкладке. Ниже приведен исправленный код, который достигает этой цели.

Ваша основная проблема заключается в том, что вы создаете экземпляры MainFrame и SubFrame, но не используете их правильно в вашем классе App. Вместо создания новых экземпляров вам необходимо использовать уже созданные экземпляры, чтобы изменения могли отразиться при нажатии кнопки на Tab2.

Вот исправленный код:

#!/usr/bin/python3.9

import tkinter as tk
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, container):
        super().__init__(container)

        self.labelA = ttk.Label(self, text="Это основная вкладка")
        self.labelA.grid(column=1, row=1, padx=30, pady=30)

        self.buttonA = tk.Button(self, text="test", command=self.toggle_button)
        self.buttonA.grid(column=1, row=2, pady=20)
        self.buttonA.config(relief="raised", bg="gray", font="Helvetica 14", width="4", height="1", bd='8')

        self.buttonB = tk.Button(self, text="activate button", command=self.toggle_button)
        self.buttonB.grid(column=1, row=3)

    def toggle_button(self):
        if self.buttonA.config('relief')[-1] == 'raised':
            self.buttonA.config(relief="sunken", text="ON", bg='green', font="Helvetica 14", width="4", height="1", bd='8')
        else:
            self.buttonA.config(relief="raised", text="test", bg="gray", font="Helvetica 14", width="4", height="1")

class SubFrame(ttk.Frame):
    def __init__(self, container, main_frame):
        super().__init__(container)
        self.main_frame = main_frame

        self.labelB = ttk.Label(self, text="Это вспомогательная вкладка")
        self.labelB.grid(column=1, row=2, padx=30, pady=30)

        self.buttonB = tk.Button(self, text="activate button on Tab 1", command=self.activate_tab1_button)
        self.buttonB.grid(column=1, row=3, padx=40)

    def activate_tab1_button(self):
        self.main_frame.toggle_button()

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.geometry('800x500')
        self.title("TABS")

        self.notebook = ttk.Notebook(self)

        self.main_frame = MainFrame(self.notebook)
        self.sub_frame = SubFrame(self.notebook, self.main_frame)

        self.notebook.add(self.main_frame, text="TAB 1")
        self.notebook.add(self.sub_frame, text="TAB 2")

        self.notebook.pack(expand=1, fill="both")

if __name__ == '__main__':
    app = App()
    app.mainloop()

Объяснение изменений:

  1. Передача ссылки на MainFrame: В классе SubFrame я добавил параметр main_frame в его конструктор, чтобы иметь доступ к экземпляру MainFrame и вызвать его метод для изменения состояния кнопки.

  2. Обновленный метод activate_tab1_button: Вместо прямого вызова метода из класса MainFrame в классе App, мы теперь вызываем этот метод через экземпляр main_frame, что позволяет корректно переключать состояние кнопки на первой вкладке.

Теперь, когда вы нажмете кнопку "activate button on Tab 1" на второй вкладке, она будет активировать кнопку "test" на первой вкладке, изменяя её состояние на "ON" и окрашивая в зеленый цвет.

Оцените материал
Добавить комментарий

Капча загружается...