为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

侃侃尔雅 2023-10-18 16:34:17
最近几天我刚刚开始自学 Python 来进行一些应用程序编程,并且之前有使用 PHP 开发网站的经验。我一直在构建一个程序,它将解析信息列表,构建收集的变量数组,然后在新的 Tkinter Toplevel 窗口中加载并使用这些变量填充 html 模板。新窗口是由根窗口中的菜单栏命令调用的函数创建的。它包含一个带有滚动条的文本框和一些按钮,允许用户选择所有文本,将其复制到剪贴板,然后关闭窗口。我遇到的问题是,我不知道在从其他函数中调用 select 和 copy 函数时如何正确引用所有内容,而且我相信这对于精通 Python 的人来说可能是一个简单的解决方案。如果我像只在一个窗口中工作一样精简代码,那么一切都会按预期工作:import tkinter as tkdef 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 tkdef 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”是否有一些简单的东西我只是错过了,因为我是这门语言的新手?编辑:为了清楚起见,根据布莱恩的评论修改了第二个示例。
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

在构建功能示例脚本以帮助人们为我解决此问题的过程中,我想我找到了罪魁祸首:

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

看起来我的引用可能有点过于具体,因为删除尝试的父引用解决了选择文本小部件内容的问题。我还必须为 textwidget 添加焦点调用才能使其工作,我也将其放入函数中:

def textselect(parent,textwidget):
    parent.event_generate("<<TextModified>>")
    textwidget.focus()
    textwidget.tag_add('sel', '1.0', 'end')

一旦我完成了这一切,我还意识到选择文本无论如何都是多余的,而且更多的是视觉上的事情,因为复制功能将复制文本框的全部内容,无论它是否突出显示。

虽然不能 100% 确定这是实现这一切的最佳方法,但它确实有效。如果谁有更好的方法,欢迎留言!


查看完整回答
反对 回复 2023-10-18
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信