【问题标题】:Highlight text when clicked in tkinter在 tkinter 中单击时突出显示文本
【发布时间】:2015-03-14 10:43:08
【问题描述】:

我正在开发我的 Python 程序(在 Ubuntu 系统上),但我对自己在做什么一无所知:我正在从文件夹中导入媒体文件名,并将其打印到 Text 小部件中,然后点击它打开VLC Player。 我只是想添加一个附加功能,即:当我点击任何文件名时,它应该是高亮的,然后在 VLC 上打开。

你能指导我怎么做吗?

import subprocess,os
from Tkinter import *

def viewFile():
    tex.delete('1.0', END)
    for f in os.listdir(path):
        if f.endswith('.h264'):
            linkname="link-" + f
            tex.insert(END,f + "\n", linkname)
            tex.tag_configure(linkname, foreground="blue", underline=True)
            tex.tag_bind(linkname, "<1>", lambda event, filename =path+'/'+f: subprocess.call(['vlc',filename]))    # Video play on VLC Player

if __name__ == '__main__':

    root = Tk()
    step= root.attributes('-fullscreen', True)

    step = LabelFrame(root,text="FILE MANAGER", font = "Arial 20 bold   italic")
    step.grid(row=1, columnspan=7, sticky='W',padx=100, pady=5, ipadx=130, ipady=25)

    Button(step,    text="ViewFile",        font = "Arial 8 bold    italic",    activebackground="turquoise",   width=30, height=5, command=viewFile).grid      (row= 6, column =3)
    Button(step,    text="Exit",            font = "Arial 8 bold    italic",    activebackground="turquoise",   width=20, height=5, command=root.quit).grid     (row= 6, column =5)

    tex = Text(master=root)                                      # TextBox For Displaying File Information
    scr=Scrollbar(root,orient =VERTICAL,command=tex.yview)
    scr.grid(row=8, column=2, rowspan=15, columnspan=1, sticky=NS)
    tex.grid(row=8, column=1, sticky=E)
    tex.config(yscrollcommand=scr.set,font=('Arial', 8, 'bold', 'italic'))

    global process
    path = os.path.expanduser("~/python")                   # Define path To play, delete, or rename video

    root.mainloop()

【问题讨论】:

  • 您使用文本小部件而不是列表框是否有原因?列表框内置了这种行为。
  • 我不擅长 Python,有人建议我使用 TextBOx 就可以了

标签: python ubuntu tkinter click highlight


【解决方案1】:

我修改了您的示例以突出显示线条。 here 解释了如何突出显示一行。基本上我添加了一个text_click_callback 来检查单击了哪一行并突出显示它并调用vlc。我更改了输入文件夹,以便能够执行代码,因为我没有任何视频文件可以使用。

import subprocess,os
from Tkinter import *


def text_click_callback(event):
    # an event to highlight a line when single click is done
    line_no = event.widget.index("@%s,%s linestart" % (event.x, event.y))
    #print(line_no)
    line_end = event.widget.index("%s lineend" % line_no)
    event.widget.tag_remove("highlight", 1.0, "end")
    event.widget.tag_add("highlight", line_no, line_end)
    event.widget.tag_configure("highlight", background="yellow")




def viewFile():
    tex.delete('1.0', END)

    for f in os.listdir(path):
        #if f.endswith('.h264'):
        linkname="link-" + f
        tex.insert(END,f + "\n", linkname)
        tex.tag_configure(linkname, foreground="blue", underline=True)
        tex.tag_bind(linkname, "<Button-1>", text_click_callback )    # highlight a line
        tex.tag_bind(linkname, "<Double-Button-1>", lambda event, filename =path+'/'+f: subprocess.call(['vlc',filename]) )    # Video play on VLC Player



if __name__ == '__main__':

    root = Tk()
    #step= root.attributes('-fullscreen', True)

    step = LabelFrame(root,text="FILE MANAGER", font = "Arial 20 bold   italic")
    step.grid(row=1, columnspan=7, sticky='W',padx=100, pady=5, ipadx=130, ipady=25)

    Button(step,    text="ViewFile",        font = "Arial 8 bold    italic",    activebackground="turquoise",   width=30, height=5, command=viewFile).grid      (row= 6, column =3)
    Button(step,    text="Exit",            font = "Arial 8 bold    italic",    activebackground="turquoise",   width=20, height=5, command=root.quit).grid     (row= 6, column =5)

    tex = Text(master=root)                                      # TextBox For Displaying File Information
    scr=Scrollbar(root,orient =VERTICAL,command=tex.yview)
    scr.grid(row=8, column=2, rowspan=15, columnspan=1, sticky=NS)
    tex.grid(row=8, column=1, sticky=E)
    tex.config(yscrollcommand=scr.set,font=('Arial', 8, 'bold', 'italic'))

    global process
    path = os.path.expanduser("/tmp")                   # Define path To play, delete, or rename video

    root.mainloop()

它的工作原理如下所示:

但我认为布莱恩·奥克利是对的。一个列表框会更好。不过,如果您想继续使用 Text,您可以按照提供的示例进行操作。

【讨论】:

  • 感谢您的合作.....这可能吗,单曲将突出显示,双曲将在 VLC 播放器上打开文件
  • @FahadUddin 是的,你可以做到。刚刚添加了&lt;Double-Button-1&gt; 按钮。请查看编辑后的代码。
  • 感谢您的太多帮助和指导....可以吗,突出显示的文件名可以保存在变量中
  • 是否有 Python 函数可以让我捕获当前用光标突出显示的文本并将其存储在变量中?
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多