问题描述
最近几天,我才开始自学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”
因为我是该语言的新手,我是否缺少一些简单的东西?
解决方法
在构建功能性示例脚本来帮助人们解决此问题的过程中,我认为是罪魁祸首:
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%地确定这是完成所有这些任务的最佳方法,但它确实有效。如果有人有更好的方法,请随时发布!