我是Tkinter的新手,我正在尝试将事件处理添加到GUI。 我有一个包含句子和单词的列表(该列表包含一个子列表,包含作为字符串作为第一个元素发送的子列表和作为其第二个元素的单词列表),我首先要使用Label小部件显示句子。我想做的是使用向上和向下键在句子之间切换。
然而,我的第一个问题是另一个问题。我想将当前显示的句子存储在名为current_sent的变量中,因此我尝试在应用程序的构造函数中为self.current_sent指定0。但是,当我尝试在我的代码中引用此变量时,我收到属性错误。当我在我的应用程序的initialize()方法中初始化self.current_sent时,我没有收到错误。谁能告诉我为什么会这样?
现在,如果我在initialize方法中设置self.current_sent = 0,则gui会启动,但按下“向下”按钮时不会有任何更改。 我也尝试使用''作为事件,但这也不会导致第二句显示。 如果我尝试从next_sent方法调用print语句,则不显示任何内容,因此我从不进入事件处理函数。 谁能告诉我,我做错了什么,拜托?
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()
答案 0 :(得分:2)
因为__init__
在定义initialize
之前调用self.current_sent
所以会出现AttributeError,因此您只需稍微重新排列__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)