最近几天我刚刚开始自学 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% 确定这是实现这一切的最佳方法,但它确实有效。如果谁有更好的方法,欢迎留言!
添加回答
举报
0/150
提交
取消