Как использовать entry.get() из одного подкласса ttk.Frame в другой подкласс ttk.Frame

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

У меня есть два подкласса: MainFrame и SubFrame. В SubFrame есть виджет ввода (entry1) для ввода времени, значение по умолчанию — 00:00. Из MainFrame я хочу получить время, которое было введено в поле entry1 в SubFrame. Как мне получить данные виджета ввода в SubFrame из MainFrame?

#!/usr/bin/python3.9

import tkinter as tk
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, container):
        style_name = f'{id(self)}.TFrame' # создаем имя стиля, используя ID объекта
        super().__init__(container, style=style_name) # применяем стиль

        s = ttk.Style()
        s.configure(style_name, background='red')

        self.labelA = ttk.Label(self, text = "Это на MainFrame")
        self.labelA.grid(column=1, row=2, padx = 30, pady = 30)

        self.buttonA = tk.Button(self, text="получить из subframe", command=self.get_time)
        self.buttonA.grid(column=1, row=3)

    def get_time(self):
        print (sf.entry1())
        
class SubFrame(ttk.Frame):
    def __init__(self, container):
        style_name = f'{id(self)}.TFrame' # создаем имя стиля, используя ID объекта
        super().__init__(container, style=style_name) # применяем стиль

        s = ttk.Style()
        s.configure(style_name, background='blue')

        self.labelB = ttk.Label(self, text = "Это на SubFrame")
        self.labelB.grid(column=1, row=2, padx = 30, pady = 30)

        self.buttonB = tk.Button(self, text="получить внутри класса", command=self.get_time)
        self.buttonB.grid(column=1, row=3)

        ## СТИЛЬ ВВОДА
        style = {'fg': 'black', 'bg': 'white', 'font': 'Helvetica 14 bold', 'width':'6', 'bd':'2', 
                        'highlightbackground':"black", 'justify':'center', 'relief':'sunken',
                        'insertontime': '0', 'takefocus': '0' } # highlightcolor':"red"

        self.entry1_var=tk.StringVar()
        self.entry1_var.set("00:00")
        self.entry1=tk.Entry(self, textvariable=self.entry1_var, width=5, justify="center",)
        self.entry1.grid(column=2, row=3, padx=(0, 0), pady=(0,10))
        self.entry1.configure(style)
 
    ## работает, если вызван из подкласса
    def get_time(self):
        print (self.entry1.get())

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

        s = ttk.Style()

        unfocus = "gray"
        focus = "#F2C84B"

        s.theme_create("custom", parent="alt", settings={
            "TNotebook": {"configure": {"tabmargins": [2, 5, 2, 0] } },
            "TNotebook.Tab": {
                "configure": {"padding": [5, 1], "background": unfocus },
                "map": {"background": [("selected", focus)],
                          "expand": [("selected", [1, 1, 1, 0])] } } } )

        s.theme_use("custom")

        self.notebook = ttk.Notebook(self)

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

        self.notebook.add(self.Frame1, text="MainFrame")
        self.notebook.add(self.Frame2, text="SubFrame")

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

        ##--------------------------------##

        self.geometry('800x500')
        #self.resizable(False, False)
        self.title("Вкладки")
           

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

    SubFrame(app)
    MainFrame(app)
    
    app.mainloop()

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

Для того чтобы передать данные из виджета Entry в одном подклассе (в данном случае SubFrame) в другой подкласс (в данном случае MainFrame), вам нужно создать метод в MainFrame, который будет получать данные из SubFrame. Это можно сделать, разместив экземпляр SubFrame в MainFrame, а затем получить доступ к Entry через этот экземпляр. Ниже представлен модифицированный код, который решает вашу задачу:

#!/usr/bin/python3.9

import tkinter as tk
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, container, sub_frame):
        style_name = f'{id(self)}.TFrame'  # создаем название стиля на основе ID объекта
        super().__init__(container, style=style_name)  # применяем стиль

        # Настройка стиля
        s = ttk.Style()
        s.configure(style_name, background='red')

        self.labelA = ttk.Label(self, text="Это MainFrame")
        self.labelA.grid(column=1, row=2, padx=30, pady=30)

        self.buttonA = tk.Button(self, text="Получить время из SubFrame", command=lambda: self.get_time(sub_frame))
        self.buttonA.grid(column=1, row=3)

    def get_time(self, sub_frame):
        # Получаем время из entry1 в SubFrame и выводим
        time_value = sub_frame.entry1_var.get()
        print(time_value)

class SubFrame(ttk.Frame):
    def __init__(self, container):
        style_name = f'{id(self)}.TFrame'  # создаем название стиля на основе ID объекта
        super().__init__(container, style=style_name)  # применяем стиль

        # Настройка стиля
        s = ttk.Style()
        s.configure(style_name, background='blue')

        self.labelB = ttk.Label(self, text="Это SubFrame")
        self.labelB.grid(column=1, row=2, padx=30, pady=30)

        # Определение переменной для entry
        self.entry1_var = tk.StringVar()
        self.entry1_var.set("00:00")
        self.entry1 = tk.Entry(self, textvariable=self.entry1_var, width=5, justify="center")
        self.entry1.grid(column=2, row=3, padx=(0, 0), pady=(0, 10))

        # Настройка кнопки для получения времени внутри SubFrame
        self.buttonB = tk.Button(self, text="Получить время внутри класса", command=self.get_time)
        self.buttonB.grid(column=1, row=3)

    # Метод для вывода времени
    def get_time(self):
        print(self.entry1_var.get())

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

        s = ttk.Style()
        self.notebook = ttk.Notebook(self)

        # Создание экземпляра SubFrame и MainFrame
        self.Frame2 = SubFrame(self.notebook)
        self.Frame1 = MainFrame(self.notebook, self.Frame2)

        # Добавление вкладок
        self.notebook.add(self.Frame1, text="MainFrame")
        self.notebook.add(self.Frame2, text="SubFrame")

        self.notebook.pack(expand=1, fill="both")
        self.geometry('800x500')
        self.title("Таб-Приложение")

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

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

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

  2. Получение значения: Метод get_time в MainFrame теперь получает значение из entry1_var во время нажатия кнопки.

Таким образом, когда вы нажимаете кнопку в MainFrame, вы получите текущее значение, введенное в Entry в SubFrame.

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

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