gpt4 book ai didi

python - tkinter 绑定(bind)不执行任何操作且属性错误

转载 作者:行者123 更新时间:2023-12-01 04:11:00 24 4
gpt4 key购买 nike

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

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

现在,如果我在初始化方法中设置 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()

最佳答案

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

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

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

关于python - tkinter 绑定(bind)不执行任何操作且属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34956200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com