tkinter实现界面显示

‘’’’’’
def AFLogAnalysisShow(self,keyword,content):
print(“keyword:%s”%keyword)
ShowLogWin = tk.Tk()
ShowLogWin.title(“Show Logs”)
ShowLogWin.geometry(“1000x600”)

winMainFrame = tk.Frame(ShowLogWin)
winMainFrame.pack(side=tk.LEFT,fill=tk.Y)

winYScroll = tk.Scrollbar(winMainFrame)
winYScroll.pack(side=tk.RIGHT,fill=tk.Y)
winXScroll = tk.Scrollbar(winMainFrame,orient=tk.HORIZONTAL)
winXScroll.pack(side=tk.BOTTOM,fill=tk.X)

winText = tk.Text(winMainFrame, width=800, height=600,xscrollcommand=winXScroll.set,yscrollcommand=winYScroll.set)

winXScroll.config(command=winText.xview)
winYScroll.config(command=winText.yview)

winText.pack(expand=tk.YES,side=tk.TOP, fill=tk.Y)
winText.tag_config("tag1",background="yellow")
winText.insert('insert', content)

ShowLogWin.mainloop()

路过的各位大咖们,小弟想实现:在text窗口中显示content内容,并且高亮显示keyword,但按照上面的代码执行结果,水平滚动条无法显示,并且没能实现高亮显示功能,还望各位大咖指教,感谢!

Python

讨论数量: 5
Jason990420

你的代码执行结果, 不管是垂直或水平的滚动条, 应该都有显示的.

如果你是指水平滚动条无法滚动, 那是因为TEXT窗口的内容如果太长就会被自动移到下一行, 所以右边没有内容, 也就不能往右滚动.

如果不想自动移到下一行, 在TEXT的参数中加上 wrap=tk.NONE 就可以了.

还有在TEXT的参数 width=800 以及 height=600, 你可能把它们的单位视为点素, 应该是字寛及行数.

你有设定了 tag1为背景黄色, 但是在插入字符串时, 没有指定 *tags, 所以才没有高亮显示.

winText.insert('insert', content, "tag1")

如果要把内容中, 特定的字符串高亮, 简单的搜索可以字符串直接标示, 复杂的必须使用 Tcl 的正则式来表示. 注意, 在此的代码是针对全部的内容, 不是插入新的内容, 因此 Widget 内容每次更新, 必须重新调用一次, 内容越多, 速度越慢.

你可以撰写新的函数, 针对新插入的内容来处理, 这样就比较不会影响到速度, 不过新旧内文拼接的部份, 就不会被考虑是被要求要高亮的内容.

以下代码未经完全验证, 如有错误请自行更正 …

def highlight_pattern(widget, pattern, tag='Highlight', options={"background":"yellow"}, regexp=True):

    widget.tag_delete(tag)
    widget.tag_config(tag, **options)
    start   = widget.index("1.0")
    stop    = widget.index("end")
    count   = tk.IntVar()   # Get the length of match
    while True:
        index = widget.search(pattern, start, stop, count=count)
        if not index:
            break
        length = count.get()
        if length == 0:
            break
        widget.tag_add(tag, index, "%s+%sc" % (index, length))
        start = "%s+%sc" % (index, length)

...

content = """af_mgr_v3: Acce preTS (90669467455275) TS (90669507175643) Info ( 9 967 48)/Gyro preTS ( 0) TS ( 0) Info ( 0 0 0)/ Gyro VectorValue ( 0) 151 D Hal3ARaw_thread: [onAFThreadLoop] sttNum (#0) FV (2058435) DAC (345) Gyro (0, 0, 0) ROI (0,1,1640,1140,2360) 12-24 15:37:56.057978 31577 31784 D ae_mgr : Gyro InValid!\n"""
winText.insert('insert', content)
winText.insert('insert', content)
highlight_pattern(winText, 'Gyro', regexp=False)

Python

2年前 评论

@Jason990420 非常感谢,在text的参数中加上wrap=tk.NONE确实是可以实现水平滚动条效果了,但高亮显示可能您没理解我的意思,例如下面这段内容中: af_mgr_v3: Acce preTS(90669467455275) TS(90669507175643) Info( 9 967 48)/Gyro preTS( 0) TS( 0) Info( 0 0 0)/ Gyro VectorValue( 0) 151 D Hal3ARaw_thread: [onAFThreadLoop] sttNum(#0) FV(2058435) DAC(345) Gyro(0, 0, 0) ROI(0,1,1640,1140,2360) 12-24 15:37:56.057978 31577 31784 D ae_mgr : Gyro InValid! 我希望实现的是:所有的Gyro都能高亮显示,其他字符普通显示即可,不知道这个功能是否可以实现,感谢!

2年前 评论
Jason990420 2年前
Jason990420

没任何回应,也没打钩?这个问题解决了吗?

2年前 评论

谢谢,此问题已经解决,感谢!

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!