最近幾天我剛剛開始自學 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
提交
取消