【发布时间】: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__)获取信息。