最近幾天我剛剛開始自學(xué) Python 來進(jìn)行一些應(yīng)用程序編程,并且之前有使用 PHP 開發(fā)網(wǎng)站的經(jīng)驗(yàn)。我一直在構(gòu)建一個程序,它將解析信息列表,構(gòu)建收集的變量數(shù)組,然后在新的 Tkinter Toplevel 窗口中加載并使用這些變量填充 html 模板。新窗口是由根窗口中的菜單欄命令調(diào)用的函數(shù)創(chuàng)建的。它包含一個帶有滾動條的文本框和一些按鈕,允許用戶選擇所有文本,將其復(fù)制到剪貼板,然后關(guān)閉窗口。我遇到的問題是,我不知道在從其他函數(shù)中調(diào)用 select 和 copy 函數(shù)時如何正確引用所有內(nèi)容,而且我相信這對于精通 Python 的人來說可能是一個簡單的解決方案。如果我像只在一個窗口中工作一樣精簡代碼,那么一切都會按預(yù)期工作: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()如果我嘗試做同樣的事情,但是從函數(shù)內(nèi)部(其中 textpop = tk.Toplevel()),它不再起作用。我嘗試傳遞對函數(shù)(父函數(shù)、小部件等)的各種引用并相應(yīng)地修改函數(shù)代碼,但沒有運(yùn)氣讓它工作。例如: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)在我的主腳本(以及此示例代碼)中,單擊“全選”按鈕將導(dǎo)致以下錯誤:AttributeError:“Toplevel”對象沒有屬性“textwidget”是否有一些簡單的東西我只是錯過了,因?yàn)槲沂沁@門語言的新手?編輯:為了清楚起見,根據(jù)布萊恩的評論修改了第二個示例。
1 回答

慕標(biāo)5832272
TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個贊
在構(gòu)建功能示例腳本以幫助人們?yōu)槲医鉀Q此問題的過程中,我想我找到了罪魁禍?zhǔn)祝?/p>
parent.textwidget.tag_add('sel', '1.0', 'end-1c')
看起來我的引用可能有點(diǎn)過于具體,因?yàn)閯h除嘗試的父引用解決了選擇文本小部件內(nèi)容的問題。我還必須為 textwidget 添加焦點(diǎn)調(diào)用才能使其工作,我也將其放入函數(shù)中:
def textselect(parent,textwidget): parent.event_generate("<<TextModified>>") textwidget.focus() textwidget.tag_add('sel', '1.0', 'end')
一旦我完成了這一切,我還意識到選擇文本無論如何都是多余的,而且更多的是視覺上的事情,因?yàn)閺?fù)制功能將復(fù)制文本框的全部內(nèi)容,無論它是否突出顯示。
雖然不能 100% 確定這是實(shí)現(xiàn)這一切的最佳方法,但它確實(shí)有效。如果誰有更好的方法,歡迎留言!
添加回答
舉報
0/150
提交
取消