Tkinter Entry всегда возвращает пустую строку - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь создать приложение с графическим интерфейсом, используя Tkinter. Этот интерфейс состоит из следующих виджетов: кнопка , запись и текст. Изображение ниже показывает это.

app image

Идея этого приложения заключается в следующем: пользователь вводит слово в запись и при нажатии кнопки Значение его значение отображается в текстовом виджете.

Мой код разделен на два класса: один для графического интерфейса пользователя и другой для самого приложения.

GUI (убран показанный ранее снимок для уменьшения кодирования):

 class Gui:
    def __init__(self, master=None):
        if master is None:
            return
        else:
            self.word = StringVar()
            self.word_meaning = None
            self.app_frame = Frame(master)
            self.app_frame.grid()
            self.create_app_frame()
            self.entry_widget = Entry(self.app_frame, textvariable=self.word)
            self.button_widget = Button(self.app_frame, text='Meaning', command=self.__handler_entry)
            self.text_widget = Text(self.app_frame, height=10, width=30)
            self.crete_app_frame()

    def crete_app_frame(self):    
        self.entry_widget.grid(row=0, column=0)
        self.button_widget.grid(row=0, column=1)
        self.text_widget.grid(row=1, column=0, columnspan=2)

    def get_word(self):
        return self.word.get()

    def set_word_meaning(self, meaning):
        self.word_meaning = meaning

    def __handler_entry(self):
        self.text_widget.delete(0., END)
        self.text_widget.insert(END, self.word_meaning)

Применение

class InteractiveDictionary:
    def __init__(self, filename):
        with open(filename, 'r') as file:
            self.data = json.load(file)

    def get_meaning(self, term):
        print('-------------------')
        print(f"world is:{term}")
        print('-------------------')
        term = str(term)
        term = term.lower()
        if term in self.data:
            return self.data[term]
        else:
            return "The world you\'re looking for doesn\'t exist."

Main

if __name__ == '__main__':
    window = Tk()
    window.title('Interactive Dictionary')
    dictionary = InteractiveDictionary('words.json')
    app = Gui(master=window)
    word = app.get_word()
    word_meaning = dictionary.get_meaning(word)
    if type(word_meaning) == list:
        for i in word_meaning:
            app.set_word_meaning(i)
    else:
        app.set_word_meaning(word_meaning)
    window.mainloop()

Приложение отлично работает, когда результаты отображаются на консоли. Однако, когда я пытаюсь отобразить в графическом интерфейсе, слово, захваченное методом get_word(), неправильно передается методу get_meaning() словарей. пусто пропущено.

Я подозреваю, что это связано с тем, как я называю Tkinter на main. Я хотел бы сохранить Gui и приложение в изоляции. Таким образом, удалить код из основного в __handler_entry() не вариант. Кто-то знает, как я могу это исправить и заставил мое приложение нормально работать?

1 Ответ

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

Кажется, вы не знаете, как работает GUI - все начинается с mainloop(), он отображает окно, получает события мыши / клавиатуры из системы, отправляет события в виджеты, (пере) рисует виджеты.

Все до mainloop() выполняется до того, как вы видите окно - поэтому word = app.get_word() выполняется до того, как вы видите окно. Вы должны использовать его в __handler_entry, который выполняется при нажатии кнопки.

Более точно в __handler_event` вам придется использовать все это

def __handler_entry(self):

    word = self.get_word()

    word_meaning = dictionary.get_meaning(word)

    if isinstance(word_meaning, list):
        for i in word_meaning:
            self.set_word_meaning(i)
    else:
        self.set_word_meaning(word_meaning)

    self.text_widget.delete(0., END)
    self.text_widget.insert(END, self.word_meaning)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...