【问题标题】:Tkinter Text widget. Unselect textTkinter 文本小部件。取消选择文本
【发布时间】:2013-12-16 12:57:48
【问题描述】:

我使用了带有Tkinter 的Text 小部件,当按下按钮时,它会将选定的文本复制到剪贴板。现在,在复制过程之后,我想取消选择文本。 知道它是如何工作的吗?

由于似乎有必要发布一些代码,以便人们更详细地了解我的问题,这里是:

def copy_to_clipboard(self, copy_string):
    #copy to clipboard function
    self.clipboard_clear()
    try:
        #text in outputlistfield marked, so copy that
        self.clipboard_append(self.outputlistfield.get("sel.first", "sel.last"))
    except:
        #no text marked

outputlistfield 是一个文本小部件。如果选择文本,则应将其复制到剪贴板。这很好用。但我想重置选择,以便在复制文本后不再选择文本。那么,有什么建议吗?

【问题讨论】:

  • 不知道为什么人们总是急于投反对票...给这家伙一个解释的机会,他今天刚刚成为会员
  • @stevieG 他似乎是一位感兴趣的用户,因为他刚刚发布并得到了地狱,希望下周当他重新登录时会有他需要的所有代码的答案。
  • @KDawG:也许他是 stackoverflow 的新手,这就是为什么 & 你只给了他 5-6 分钟
  • 您正在寻找self.outputlistfield.tag_remove(SEL, "0.0", END)。我不知道如何重新打开您的问题,因此我可以将其添加为答案。但是,关于您的问题,我有一些 cmets:1)您的问题与剪贴板副本无关,因此应该忽略 pert。 2)您可能尝试了一些对您不起作用的东西。如果你能展示出来就好了。 3) 自包含且可运行的最小示例,它表明问题是获得帮助的最佳方式。

标签: python text widget tkinter


【解决方案1】:

self.outputlistfield.tag_remove(SEL, "1.0", END) 可以解决问题。如本例所示:

from tkinter import ttk
from tkinter import *

class Main(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)  
        self.title("Test")

        self.text = Text(self)
        self.text.insert(END, "This is long long text, suitable for selection and copy.")
        self.text.pack(expand=True, fill=BOTH)

        self.frame = ttk.Frame(self)
        self.frame.pack(expand=True, fill=BOTH)

        self.button1 = ttk.Button(self.frame, text="Copy", command=self.OnCopy)
        self.button1.pack(expand=True, fill=BOTH)

        self.button2 = ttk.Button(self.frame, text="Copy & Unselect", command=self.OnCopyDeselect)
        self.button2.pack(expand=True, fill=BOTH)

    def OnCopy(self):
        try:
            text = self.text.selection_get()
        except TclError:
            print("Select something")
        else:
            self.clipboard_clear()
            self.clipboard_append(text)
        self.text.focus()

    def OnCopyDeselect(self):
        self.OnCopy()
        self.text.tag_remove(SEL, "1.0", END)

root = Main()
root.mainloop()

【讨论】:

  • 正确的文本索引是“1.0”——行数从一开始,而不是零。
  • @BryanOakley 谢谢,我不知道。固定。
【解决方案2】:

最简单的最小解决方案是在添加到剪贴板后立即使用 {text widget}.tag_remove(Tkinter.SEL, '1.0', Tkinter.END) 从整个 Text 小部件中删除“SEL”标记。修改后的代码(带有一个#NEW LINE,特定于您的代码)如下:

def copy_to_clipboard(self, copy_string):
    #copy to clipboard function
    self.clipboard_clear()
    try:
        #text in outputlistfield marked, so copy that
        self.clipboard_append(self.outputlistfield.get("sel.first", "sel.last"))
        self.outputlistfield.tag_remove("sel", "sel.first", "sel.last") #NEW LINE
    except:
        #no text marked

【讨论】:

  • 另外,请注意,作为尝试/排除的选项,您可以使用以下if self.outputlistfield.tag_ranges('sel'):检查是否选择了任何文本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多