【问题标题】:underline only selected words in tkinter仅在 tkinter 中为选定的单词加下划线
【发布时间】:2021-04-15 15:16:07
【问题描述】:

我通过单击此按钮创建了一个按钮underline,Entry 内的整个文本都带有下划线。但是
我只希望那些被我的光标选中的单词加下划线。

import tkinter as tk
from tkinter import font as tkFont
root = tk.Tk()


text = tk.Entry()
text.pack()

def underline():
    f = tkFont.Font(text, text.cget("font"))
    f.configure(underline = True)
    text.configure(font=f)


underline =tk.Button(root,text="underline",command=underline)
underline.pack()



root.mainloop()

【问题讨论】:

  • 加下划线是因为您将整个字体设置为f

标签: python-3.x tkinter


【解决方案1】:

这是一种非常简单的方法(如果选择已经带下划线,它也会取消下划线)也不能用 Entry 做到这一点:

from tkinter import Tk, Text, Button
from _tkinter import TclError


root = Tk()

text = Text(root)
text.pack()


def underline():
    try:
        if text.tag_nextrange('underline_selection', 'sel.first', 'sel.last') != ():
            text.tag_remove('underline_selection', 'sel.first', 'sel.last')
        else:
            text.tag_add('underline_selection', 'sel.first', 'sel.last')
            text.tag_configure('underline_selection', underline=True)
    except TclError:
        pass


underline_btn = Button(root, text="underline", command=underline)
underline_btn.pack()

root.mainloop()

所以基本上发生的情况是,当调用函数时,它首先查看是否在选择中已经有一个带下划线的标签(标签名称可以是你想要的,它们不是由 tkinter 预先确定的)并且如果选择的下划线很清晰如果不是(所以所有选定的字符都没有下划线)它应用下划线。

如果用户在没有选择的情况下按下按钮,请尝试 except 以捕获错误。

【讨论】:

  • 我还想问你如何使用此方法更改颜色,因为我尝试过但没有发生任何事情我使用colorchooser 选择颜色并将值存储在 var color_var 之后我使用了@ 987654324@ 但什么也没发生
  • @satyamjha 你必须使用关键字foreground 因为fg 不起作用
  • 非常感谢foreground = color_var :-)
【解决方案2】:

您不能在条目小部件中为某些单词添加下划线。但是您可以使用标签为 Text 小部件中的某些单词添加下划线。您所要做的就是找到需要下划线的单词,然后用标签添加它们。可能最简单的方法是标记整个条目并分段添加,仅在预定义的单词下划线:

import tkinter as tk
from tkinter import font as tkFont
root = tk.Tk()

text = tk.Text(width=30,height=1,font=("Arial",11))
text.tag_configure("underlined",font=("Arial",11,"underline"))
text.pack()

def underline():
    words = ["hello","world"]
    content = text.get(1.0,tk.END+"-1c").split(' ')
    text.delete(1.0,tk.END)
    for c in content:
        if c in words:
            text.insert(tk.END,c, "underlined")
        else:
            text.insert(tk.END,c)
        text.insert(tk.END,' ')
    text.delete(tk.END+"-2c")
    
underline =tk.Button(root,text="underline",command=underline)
underline.pack()

root.mainloop()

表达式tk.END+"-1c" 表示从内容中省略最后一个字符(换行符)。同样,表达式text.delete(tk.END+"-2c") 会删除最后两个字符(尾随空格和换行符)。

【讨论】:

  • 所以使用它可以只在words 列表中的单词下划线?
  • 是的。你可以试试。写下任何包含“你好”或“世界”的文字,它们会被加下划线。所有其他人都不会。
  • 我注意到了,但这有点不切实际,不是吗?
  • 啊,我的错。我误读并认为他们只是想在某些字词下划线。为了给小部件中当前选择的单词添加下划线,当然可以使用 Matiiss 的解决方案。
  • 哦,好的,但实际上我考虑过了,如果只有一种方法可以自动将单词附加到列表中,例如通过选择单词将被附加(或者更像是覆盖)列表并使用当前代码加下划线
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2018-08-15
  • 2017-01-05
  • 2017-12-04
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多