【问题标题】:Tkinter Entry always returning empty stringTkinter 条目总是返回空字符串
【发布时间】:2019-09-10 09:57:21
【问题描述】:

我正在尝试使用Tkinter 创建一个 GUI 应用程序。该界面由以下小部件组成:按钮、条目和文本。 下图显示了它。

这个应用程序背后的想法是:用户在 entry 上输入一个单词,然后点击 Meaning 按钮,它的含义会显示在文本小部件中。

我的代码分为两类:一类用于 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."

主要:

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()

当结果显示在控制台上时,应用程序运行良好。但是,当我尝试在 GUI 上显示时,get_word() 方法捕获的单词未正确传递给字典 get_meaning() 方法。传递了一个 empty。

我怀疑这与我在 main 上调用 Tkinter 的方式有关。 我想让 Gui 和应用程序保持隔离。因此,将主代码中的代码删除到__handler_entry() 不是一种选择。有人知道我该如何修复它并让我的应用正常运行吗?

【问题讨论】:

    标签: python python-3.x oop tkinter


    【解决方案1】:

    您似乎不知道 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)
    

    【讨论】:

      猜你喜欢
      • 2016-12-16
      • 2019-07-25
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2018-11-18
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多