Вопрос или проблема
У меня есть два подкласса: 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()
Объяснение изменений:
-
Передача аргумента: В конструкторе
MainFrame
добавлен аргументsub_frame
, который будет представлять собой экземплярSubFrame
. Это позволяет получить доступ к переменнойentry1_var
изSubFrame
. -
Получение значения: Метод
get_time
вMainFrame
теперь получает значение изentry1_var
во время нажатия кнопки.
Таким образом, когда вы нажимаете кнопку в MainFrame
, вы получите текущее значение, введенное в Entry
в SubFrame
.