Python / Tkinter-选择并复制所有文本内容,然后单击按钮从其他功能复制到剪贴板

问题描述

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

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

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,20))
selectbutton = tk.Button(textpop,text="Select All",command = textselect)
selectbutton.pack(side="right",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','end-1c')

def textwindow(title,content):
    textpop = tk.Toplevel()
    textpop.title(title)
    textarea = tk.Text(textpop,wrap="none")
    textarea.pack(side="left",pady=20)
    textarea.insert("1.0",content)
    exitbutton = tk.Button(textpop,command = textpop.destroy)
    exitbutton.pack(side="right",20))
    copybutton = tk.Button(textpop,command = lambda: clipit(textpop,textarea))
    copybutton.pack(side="right",20))
    selectbutton = tk.Button(textpop,command = lambda: textselect(textpop,textarea))
    selectbutton.pack(side="right",20))
    textarea.focus()
    textpop.mainloop()

window = tk.Tk()
window.title("Main Window")
launchbutton = tk.Button(window,text = "Launch Window",command = lambda: textwindow("Toplevel Popup","Text Area Text"))
launchbutton.pack(padx=20,pady=20)
window.mainloop()

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

AttributeError:“顶级”对象没有属性“ textwidget”

因为我是该语言的新手,我是否缺少一些简单的东西?

编辑:基于Bryan的评论,为清晰起见,修改了第二个示例。

解决方法

在构建功能性示例脚本来帮助人们解决此问题的过程中,我认为是罪魁祸首:

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

看起来我对我的引用可能有点过于具体,因为删除尝试的父引用可以解决选择textwidget内容的问题。我还必须为textwidget添加一个焦点调用以使其工作,我也将其加入到该函数中:

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

一旦所有这些工作完成,我还意识到选择文本无论如何都是多余的,并且更像是视觉上的事情,因为复制功能将复制文本框的全部内容,而不管其是否突出显示。>

不能100%地确定这是完成所有这些任务的最佳方法,但它确实有效。如果有人有更好的方法,请随时发布!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...