【问题标题】:tkinter binding doesn't do anything and attribute errortkinter 绑定不执行任何操作并且属性错误
【发布时间】:2016-04-29 14:43:48
【问题描述】:

我是 Tkinter 的新手,我正在尝试将事件处理添加到 GUI。 我有一个包含句子和单词的列表(该列表包含一个子列表,其中包含作为第一个元素发送的字符串和作为第二个元素的单词列表),我首先想使用 Label 小部件显示句子.我想做的是使用向上和向下键在句子之间切换。

然而,我的第一个问题是另一个问题。我想将当前显示的句子存储在一个名为 current_sent 的变量中,因此我尝试在应用程序的构造函数中将 0 分配给 self.current_sent。但是,当我尝试在代码中引用此变量时,出现属性错误。当我在我的应用程序的 initialize() 方法中初始化 self.current_sent 时,我没有收到错误消息。谁能告诉我这是为什么?

现在,如果我在初始化方法中设置 self.current_sent = 0,则 gui 启动,但按下 Down 按钮时我没有得到任何更改。 我也尝试过仅使用 '' 作为事件,但这也不会导致显示第二句。 如果我尝试从 next_sent 方法调用打印语句,则不会显示任何内容,因此我从不进入事件处理函数。 谁能告诉我,我做错了什么,好吗?

import nltk
import Tkinter as tk
import os

class Annotator(tk.Tk):
    def __init__(self, parent):
        tk.Tk.__init__(self, parent)
        self.sents = self.get_sents()
        self.initialize()
        self.current_sent = 0
        self.current_word = 0

    def sent_tokenize(self, textfile):
        f = open(textfile)
        s = f.readlines()
        text = " ".join(s)
        sents = nltk.sent_tokenize(text)
        tags = [[x,nltk.word_tokenize(x)] for x in sents]
        return tags

    def get_sents(self):
        article_files = self.get_articles()
        list_of_sents = [self.sent_tokenize(x) for x in article_files]
        sents = [sent for sublist in list_of_sents for sent in sublist]
        return sents

    def get_articles(self):
        directory = "/Users/------------/Documents/reuters/reuters/articles"
        list_of_articles = []
        for f in os.listdir(directory):
            if not f.startswith('.'):
                filename = directory + "/" + f
                list_of_articles.append(filename)
        return list_of_articles

    def next_sent(self,event):
        if (self.current_sent < len(self.sents) - 1):
            self.current_sent += 1
            self.label.config(text = self.sents[self.current_sent][0])

    def initialize(self):
        self.label = tk.Label(text = self.sents[self.current_sent][0])
        self.label.bind('<KeyPress-Down>', self.next_sent)
        self.label.grid(row = 0, column = 0, columnspan = 2)



if __name__ == "__main__":
        app = Annotator(None)
        app.mainloop()

【问题讨论】:

  • Tk 是根窗口,它不需要父窗口,请查看help(tk.Tk.__init__) 获取信息。

标签: python tkinter


【解决方案1】:

出现 AttributeError 是因为 __init__ 在定义 self.current_sent 之前调用了 initialize,所以您只需稍微重新排列 __init__

def __init__(self, parent):
    tk.Tk.__init__(self, parent)
    self.current_sent = 0
    self.current_word = 0
    self.sents = self.get_sents()
    self.initialize()

至于 Binding 问题,只有具有键盘焦点的小部件才会响应事件,要么在测试事件之前尝试单击标签,要么将其设置为无论有什么焦点都响应,如下所示:

self.bind_all('<KeyPress-Down>', self.next_sent)

【讨论】:

  • 谢谢,它使用 bind_all 函数工作。但是,点击标签并使用 self.label.bind(...) 不起作用。
  • 是的,键盘焦点非常挑剔,几乎所有情况下.bind_all() 的键盘键都是需要的,但有时会弄乱可以同时接受文本和执行其他操作的键的 Entry 或 Text 对象。跨度>
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 2021-09-15
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多