0

我正在编写一个快速阅读器程序,其中我获取一个带有定义列表的 .txt 并显示关键字,同时在下面逐字打印定义,模拟 Spritz 快速阅读器。这一切都在 Tkinter 窗口中完成。

我创建了一个 list keyword=i[0] ,其中包含 .txt 中每一行 (i) 的关键字,以及一个 list definition=i[1:] 包含定义,每个单词都有自己的标记。

例如,如果 .txt 的 line1 是“错误:程序中的错误”,我需要输出看起来像这样。

bug:

    an

然后

bug:

    error

依此类推,直到定义结束。然后,将“bug”替换为下一个要定义的词。

所以......我如何在定义的每个单词中保留“错误”?这是我所拥有的一部分。它目前还相互打印单词,因此我需要删除每个单词,然后再将其替换为另一个单词。这是我第一次使用 Tkinter,所以请多多包涵。

def cycle_text(root, canvas, file_name, width, height, font_size, wpm):
    canvas.create_rectangle(0, 0, width, height, fill='Beige')
    topics = write_title(file_name)
    information = write_info(file_name)
    pause = 60/wpm
    for i in topics:
        canvas.create_text(200, 200, text=i, font = ('Courier', font_size))
    for j in information:
        for z in j:
            canvas.create_text(250, 250, text=z, font = ('Courier', font_size))
            time.sleep(pause)
4

1 回答 1

0

使用create_方法时,将返回值保存到变量中。然后,您可以将其切换为不同的文本,configitemconfig不是一遍又一遍地创建新文本。例如,使用Label小部件:

wordlist = ['an', 'error', 'in', 'a', 'program']

def nextword(self, which):
    definitionword.config(text=wordlist[which])
    if which+1 < len(wordlist):
        self.root.after(self.wpm*1000/60, lambda: nextword(which+1))

self.theword = Label(self.canvas, text='bug')
self.theword.grid(row=0, column=0)
self.definitionword = Label(self.canvas, text='')
self.definitionword.grid(row=1, column=0)

self.nextword(0)

这是一个近似值。您需要使用自己的数据结构和名称。

如果您更愿意使用Canvas小部件create_text而不是Labels,请尝试以下操作:

self.definitionword = self.canvas.create_text(250, 250, text=wordlist[0])
self.canvas.itemconfig(self.definitionword, text=wordlist[1])

基本上,您将定义的单词与其定义的单词列表分开,然后重复重新配置“定义中的单词”小部件以显示定义中下一个单词的文本。

不要time.sleep用来延迟事件tkinter-tkinter更新其显示的方式sleep不会像您期望的那样运行。请改用该after方法。

查看Effbot 上的 tkinterbook,了解有关tkinter.

于 2015-03-29T03:57:56.877 回答