如何使用Gtk3和TextView小部件定义迭代点以更改文本特定部分的颜色?

时间:2019-05-30 02:24:06

标签: python colors textview gtk3

我正在为音乐播放器应用程序修改python插件。该插件使用lrc文件显示同步歌词。这些文件具有以下格式,可以在给定时间显示行:

[00:02.32]Some lyric
[00:03.21]More lyrics
[00:05.76]You get the point by now

有一个称为elrc的lrc文件的“改进”版本。它们是相同的,除了它们可以在行内包含时间戳,如下所示:

[00:02.32]Some lyric <00:02.98>something else is shown here
[00:03.21]More lyrics <00:04.21>even more lyrics <00:05.21>maybe two of these
[00:05.76]You get the point by now x2

我修改了插件,使其支持elrc文件。我想这样做的方法是在遇到时间戳时更改文本的颜色,但是应更改的文本区域必须在下一个时间戳处停止。因此,如果每个字都有时间戳,则文本的颜色会在正确的时间逐字更改。

插件的工作方式是通过时间戳和单词/行的二维数组。

def _set_timers(self):
    print_d("Setting timers")
    if len(self._timers) == 0:
        cur_time = self._cur_position()
        cur_idx = self._greater(self._lines, cur_time)
        if cur_idx != -1:
            while (cur_idx < len(self._lines) and
                   self._lines[cur_idx][0] < cur_time + self.SYNC_PERIOD):

                timestamp = self._lines[cur_idx][0]
                line = self._lines[cur_idx][1]
                #word = self._words[cur_idx][1]
                tid = GLib.timeout_add(timestamp - cur_time, self._show, line, #word)
                self._timers.append((timestamp, tid))
                cur_idx += 1

(行和带有“#”标记的参数是我添加的使插件支持elrc文件的行。我将它们区别开来,以便您可以看到插件最初的工作方式。)

_lines和_words变量是数组,它们的值传递到“ _show”函数,然后使用Gtk的TextView在屏幕上显示歌词。这是_show函数:

def _show(self, line, word):
    self.text_buffer.set_text(line)
    #startIter = self.text_buffer.get_start_iter()
    #endIter = self.text_buffer.get_end_iter()
    #color = self.text_buffer.create_tag("highlight", foreground=self._highlight_text())
    #self.text_buffer.apply_tag(color, startIter, endIter)
    self._start_clearing_from += 1
    print_d("♪ %s ♪" % line.strip())
    return False

和以前一样,我标记为“#”的行是我添加以支持elrc标记的行(因此,逐字显示)。我遇到的问题是“ apply_tag”方法仅使用iters作为值来定义必须更改的文本部分,而我找不到找到使这些iters成为“ word”参数的方法。请记住,大多数代码不是我的,并且大多数代码都严重缺乏注释,因此我不明白它是如何100%工作的。如果需要更多上下文来解决此问题,可以询问我,也可以自己检查整个源代码。您可以找到原始的未经修改的插件here,也可以找到我的插件here的版本(稍有过时的版本)。

0 个答案:

没有答案