Из одного класса в другой перебросить переменную
У меня есть один класс A, в нем есть функция.
Есть другой класс B, в нем есть функция.
Если быть более точным, то мне нужно открыть доступ к переменным из одного класса в другом, так, чтобы не использовать метод global, возможно ли?
вот код:
class Root():
"""Инициализация приложения, открытие"""
def init(self):
self.root = Tk()
self.root.title("Графический интерфейс чата")
self.root.geometry('800x600')
self.root.iconbitmap() #<= сюда нужна иконка приложения в формате ico
self.root.resizable(False,False)
'''Переменные'''
self.message_send = ''
'''Настройка поля для отправки сообщения'''
self.entry = Entry(bd=1, width=40)
self.entry.place(x=350, y=540)
"""Настойка кнопок"""
self.button_send = PhotoImage(file="send_mes.png").subsample(4,4)
self.b_send = Button(self.root, image=self.button_send, bd=0, command=Send_mes_button.send, width=80, height=80)
self.b_send.place(x=620, y=490)
self.button_zakr = PhotoImage(file="zakr.png").subsample(5,5)
self.b_zakr = Button(self.root, image=self.button_zakr, bd=0, command=lambda : print("Нажата кнопка закрепить!"), width=60, height=60)
self.b_zakr.place(x=690, y=490)
class Send_mes_button():
def send(self):
self.Root.message_send = entry.get() #здесь возникает ошибка, перебровал все варианты в моем предыдущем вопросе ответы, но не сработало
print(self.message_send)
Root().init()
Send_mes_button().send()
Ответы (2 шт):
Используйте наследование. Вот как:
from tkinter import *
class Root:
"""Инициализация приложения, открытие"""
def init(self):
self.root = Tk()
self.root.title("Графический интерфейс чата")
self.root.geometry('800x600')
self.root.resizable(False,False)
'''Переменные'''
self.message_send = ''
'''Настройка поля для отправки сообщения'''
self.entry = Entry(bd=1, width=40)
self.entry.place(x=350, y=540)
"""Настойка кнопок"""
self.b_send = Button(self.root, bd=0, width=80, height=80)
self.b_send.place(x=620, y=490)
self.b_zakr = Button(self.root, bd=0, command=lambda : print("Нажата кнопка закрепить!"), width=60, height=60)
self.b_zakr.place(x=690, y=490)
class Send_mes_button(Root): # В скобках вы указуете от какого класса наследовать (в данном случае о т Root)
def __init__(self):
self.init()
self.b_send.config(command=self.send)
def send(self):
self.message_send = self.entry.get()
print(self.message_send)
Send_mes_button().send()
Расширять Root стоит от Tk или от Frame
Ваши классы совершенно независимы, поэтому, содержимое поля ввода проще передать через lambda функцию, задав аргумент
command=lambda: Send_mes_button().send(self.entry.get())
Это сразу создаст объект класса и вызовет метод
Я закомментировал всё, что связано с изображениями, чтобы код можно было запустить везде. Верните тогда то, что нужно
Кстати, из кода не ясно, нужен ли вам отдельный класс. send мог быть просто метод в Root. Тогда вы могли там просто получить self.entry.get()
from tkinter import *
class Send_mes_button():
def send(self, message_send):
print(message_send)
class Root(Tk):
"""Инициализация приложения, открытие"""
def __init__(self):
super().__init__()
self.title("Графический интерфейс чата")
self.geometry('800x600')
# self.iconbitmap() # <= сюда нужна иконка приложения в формате ico
self.resizable(False, False)
'''Переменные'''
'''Настройка поля для отправки сообщения'''
self.entry = Entry(self, bd=1, width=40)
self.entry.place(x=350, y=540)
"""Настойка кнопок"""
# self.button_send = PhotoImage(file="send_mes.png").subsample(4, 4)
self.b_send = Button(self, text="send", bd=0, command=lambda: Send_mes_button().send(self.entry.get()), width=80, height=80)
self.b_send.place(x=400, y=490)
# self.button_zakr = PhotoImage(file="zakr.png").subsample(5, 5)
# self.b_zakr = Button(self, image=self.button_zakr, bd=0, command=lambda: print("Нажата кнопка закрепить!"), width=60, height=60)
# self.b_zakr.place(x=690, y=490)
Root().mainloop()