Использование .get () для извлечения переменной Tkinter из другого класса - PullRequest
0 голосов
/ 07 апреля 2019

Я пишу приложение Tkinter, которое требует, чтобы части пользовательского дисплея существовали в двух разных классах, оба импортированных из другого файла.Мне нужно взять часть пользовательского ввода и передать его из одного класса в другой.В приведенном ниже примере с игрушкой пользователь должен ввести что-то в my_entry_input, к которому позже должен получить доступ класс PullVariable.

Код приведен ниже.У меня было несколько мыслей, таких как использование глобальных переменных или создание функции в исходном классе, чтобы получить переменные и затем передать их обратно.Во всех случаях я получаю:

AttributeError: тип объекта «Приложение» не имеет атрибута «my_entry»

Лучшее решение, которое я могу придумать, - это создать функциюкоторый отвечает на привязку, затем передает .get() другому классу из этой функции.Мне кажется, что tkinter не нравится .get() между занятиями.

Спасибо сообществу за помощь.

ГЛАВНЫЙ

from import_test1 import *

root=Tk()
ui = Application(root)
ui.hello_world()
ui.entry()

pv = PullVariable()

if __name__ == '__main__':
    root.mainloop()

ИМПОРТНЫЙ КОД

from tkinter import *
from tkinter import ttk

class Application(Frame):        
    def __init__(self, parent, *args, **kwargs):
        print('Application init')
        Frame.__init__(self, parent, *args, **kwargs)
        self.parent=parent
        self.parent.grid()

    def entry(self):
        self.my_entry = StringVar(self.parent)
        my_entry_input = Entry(self.parent, textvariable=self.my_entry, 
            width=16)
        my_entry_input.bind('<FocusOut>', self.show_entry)
        my_entry_input.grid(column=0, row=1)
        self.show_label = Label(self.parent, text = '')
        self.show_label.grid(column=0, row=2)

    def hello_world(self):
        print('hello world')
        self.hw = Label(self.parent, text='Hello World!')
        self.hw.grid(column=0, row=0)

    def show_entry(self, event):
        PullVariable(Application).find_entry()

class PullVariable:
    def __init__(self, app):
        self.app = app
        print('Pull initiated')

    def find_entry(self, event=None):
        self.pulled_entry = self.app.my_entry.get()
        self.app.show_label['text'] = self.pulled_entry

1 Ответ

0 голосов
/ 07 апреля 2019

my_entry не является атрибутом класса Application, поэтому вы не можете сделать Application.my_entry, так как он является атрибутом экземпляра класса Application, поэтому вы можете сделать Application().my_entry.Вероятно, вы можете добавить экземпляр Application или my_entry к методу __init__ для PullVariable.Я буду использовать первый.

# ...
class PullVariable:
    def __init__(self, app): # add app here
        self.pulled_entry = app.my_entry.get() # use app here
        print(self.pulled_entry)
# and then
root=Tk()
ui = Application(root)
ui.hello_world()
ui.entry()

pv = PullVariable(ui) # supply PullVariable with instance of Application
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...