2016-01-22 57 views
1

我是新來的Tkinter,我試圖添加事件處理GUI。 我有一個包含句子和單詞的列表(該列表包含一個由發送的字符串作爲其第一個元素和它的單詞列表作爲其第二個元素的子列表),我首先想要使用標籤顯示句子小部件。我想要做的是使用向上和向下鍵在句子之間切換。tkinter綁定不會做任何事情和屬性錯誤

然而,我的第一個問題是另一個問題。我想將當前顯示的句子存儲在名爲current_sent的變量中,因此我嘗試在應用程序的構造函數中將0賦給self.current_sent。但是,當我嘗試在代碼中引用此變量時,出現屬性錯誤。當我在應用程序的initialize()方法中初始化self.current_sent時,我沒有收到錯誤。有人可以告訴我爲什麼這是嗎?

現在,如果我在初始化方法中設置self.current_sent = 0,那麼gui會啓動,但在按下向下按鈕時不會發生任何更改。 我也試過這個只使用''作爲事件,但是這也不會導致顯示第二個句子。 如果我嘗試從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() 
+0

'Tk'是根窗口,它不需要父親btw,查看'help(tk.Tk .__ init __)'獲取信息。 –

回答

2

的AttributeError的來臨,因爲__init__電話initialize定義self.current_sent之前,所以你只需要重新排列__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() 

至於粘合問題,只能用鍵盤焦點的窗口小部件將對事件做出響應,或者在測試事件之前嘗試點擊標籤或將其設置爲響應,而不管這樣的焦點如何:

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

謝謝,它使用bind_all函數。但是,單擊標籤並使用self.label.bind(...)不起作用。 – eager2learn

+0

是的鍵盤焦點是相當挑剔的,幾乎所有的情況''.bind_all()'的鍵盤鍵是所需要的,但有時會混淆入口或文本對象,可以接受文本同時鍵執行其他事情。 –