突出显示类型上的文本:不规则函数行为

时间:2017-03-07 23:56:04

标签: python tkinter

我有两个文本窗口。当用户键入/时,此行所在的行应以黄色突出显示。两个窗口都会发生这种情况。我所遇到的错误是在左侧窗口中输入/并未突出显示行,直到在右侧窗口中输入了带有/的行。然后该程序按预期工作。我很困惑因为调用了相同的函数。 这是最小的代码:

#! python3
from tkinter import *

def search(text_widget):
    pos = '1.0'
    while True:
        idx = text_widget.search('/', pos, END)
        if not idx:
            break
        idx = idx.split('.')[0]     # start of line
        pos = '{}.0'.format(int(idx) + 1)   # end of line
        text_widget.tag_add('steno', '{}.0'.format(idx), '{}.end'.format(idx))

def changeText(*args):
    if '/' in Left_Text.get(1.0, END):
        search(Left_Text)

    if '/' in Right_Text.get(1.0, END):
        search(Right_Text)

    else:
        Left_Text.tag_remove('steno', 1.0, END)
        Right_Text.tag_remove('steno', 1.0, END)



root = Tk()

frame = Frame(root)
Left_Text = Text(frame, width=20, height=20)
Left_Text.tag_configure('steno', background='yellow', foreground='black')
Left_Text.pack(side=LEFT, padx=5, pady=5)
Left_Text.bind("<Key>", changeText)

Right_Text = Text(frame, width=20, height=20)
Right_Text.tag_configure('steno', background='yellow', foreground='black')
Right_Text.pack(side=RIGHT, padx=5, pady=5)
Right_Text.bind("<Key>", changeText)

frame.pack()

mainloop()

1 个答案:

答案 0 :(得分:1)

如果您输入&#34; /&#34;在左边,你首先点击这句话:

if '/' in Left_Text.get(1.0, END):
    print("searching left...")
    search(Left_Text)

这将按照您的意愿添加突出显示。

接下来,您有以下代码。因为条件是假的,你会落入其他地方:

if '/' in Right_Text.get(1.0, END):
    print("searching right...")
    search(Right_Text)

else:
    Left_Text.tag_remove('steno', 1.0, END)
    Right_Text.tag_remove('steno', 1.0, END)

因此,您正在添加突出显示,然后立即删除突出显示。

你应该改变你的逻辑(注意在第二种情况下使用elif):

if '/' in Left_Text.get(1.0, END):
    ...
elif '/' in Right_Text.get(1.0, END):
    ...
else:
    ...

顺便说一下:小部件的第一个索引是"1.0",而不是1.0。索引是字符串,而不是浮点数。浮点数在某些情况下有效,但仅限于实现的副作用。你应该养成总是使用字符串作为索引的习惯。