Python / Tkinter - 从另一个功能单击按钮时选择所有文本内容并将其复制到剪贴板

最近几天我刚刚开始自学 Python 来进行一些应用程序编程,并且之前有使用 PHP 开发网站的经验。我一直在构建一个程序,它将解析信息列表,构建收集的变量数组,然后在新的 Tkinter Toplevel 窗口中加载并使用这些变量填充 html 模板。新窗口是由根窗口中的菜单栏命令调用的函数创建的。它包含一个带有滚动条的文本框和一些按钮,允许用户选择所有文本,将其复制到剪贴板,然后关闭窗口。


我遇到的问题是,我不知道在从其他函数中调用 select 和 copy 函数时如何正确引用所有内容,而且我相信这对于精通 Python 的人来说可能是一个简单的解决方案。如果我像只在一个窗口中工作一样精简代码,那么一切都会按预期工作:


import tkinter as tk


def clipit():

    textpop.clipboard_clear()

    textpop.event_generate("<<TextModified>>")

    textpop.clipboard_append(textarea.get('1.0', 'end'))

    textpop.update()

    

def textselect():

    textpop.event_generate("<<TextModified>>")

    textarea.tag_add('sel', "1.0", 'end-1c')


textpop = tk.Tk()

textarea = tk.Text(textpop, wrap="none")

textarea.pack(side="left", fill="both", padx=20, pady=20)

textarea.insert("1.0", "This is a test - Try to select all and copy!")

exitbutton = tk.Button(textpop, text="Close", command = textpop.destroy)

exitbutton.pack(side="right", padx=(5,20), pady=(0,20))

copybutton = tk.Button(textpop, text="Copy", command = clipit)

copybutton.pack(side="right",padx=5, pady=(0,20))

selectbutton = tk.Button(textpop, text="Select All", command = textselect)

selectbutton.pack(side="right",padx=5, pady=(0,20))

textarea.focus()

textpop.mainloop()

如果我尝试做同样的事情,但是从函数内部(其中 textpop = tk.Toplevel()),它不再起作用。我尝试传递对函数(父函数、小部件等)的各种引用并相应地修改函数代码,但没有运气让它工作。例如:


import tkinter as tk


def clipit(parent,textwidget):

    parent.clipboard_clear()

    parent.event_generate("<<TextModified>>")

    parent.clipboard_append(textwidget.get('1.0', 'end'))

    parent.update()

    

def textselect(parent,textwidget):

    parent.event_generate("<<TextModified>>")

    parent.textwidget.tag_add('sel', "1.0", 'end-1c')


def textwindow(title,content):

    textpop = tk.Toplevel()

    textpop.title(title)

    textarea = tk.Text(textpop, wrap="none")

    textarea.pack(side="left", fill="both", padx=20, pady=20)

    textarea.insert("1.0", content)



在我的主脚本(以及此示例代码)中,单击“全选”按钮将导致以下错误:


AttributeError:“Toplevel”对象没有属性“textwidget”


是否有一些简单的东西我只是错过了,因为我是这门语言的新手?


编辑:为了清楚起见,根据布莱恩的评论修改了第二个示例。


侃侃尔雅
浏览 246回答 1
1回答

慕标5832272

在构建功能示例脚本以帮助人们为我解决此问题的过程中,我想我找到了罪魁祸首:parent.textwidget.tag_add('sel',&nbsp;'1.0',&nbsp;'end-1c')看起来我的引用可能有点过于具体,因为删除尝试的父引用解决了选择文本小部件内容的问题。我还必须为 textwidget 添加焦点调用才能使其工作,我也将其放入函数中:def&nbsp;textselect(parent,textwidget): &nbsp;&nbsp;&nbsp;&nbsp;parent.event_generate("<<TextModified>>") &nbsp;&nbsp;&nbsp;&nbsp;textwidget.focus() &nbsp;&nbsp;&nbsp;&nbsp;textwidget.tag_add('sel',&nbsp;'1.0',&nbsp;'end')一旦我完成了这一切,我还意识到选择文本无论如何都是多余的,而且更多的是视觉上的事情,因为复制功能将复制文本框的全部内容,无论它是否突出显示。虽然不能 100% 确定这是实现这一切的最佳方法,但它确实有效。如果谁有更好的方法,欢迎留言!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python