我試圖了解 ttk.Entry 小部件顯示的奇怪行為。如果我在函式中宣告 Entry 小部件 textvariable 并從 main 呼叫該函式(我在其中創建一個根物件并運行我的 mainloop),則由于某種原因不會顯示 textvariable。但是,如果我也在我的函式中運行 root.mainloop() ,那么 textvariable 就會正確顯示。這是為什么?當 mainloop() 已經在 main 中運行時,為什么我還需要在我的函式中再次運行它?
在下面的代碼中,首先按原樣運行并觀察 Entry 小部件保持為空,然后取消注釋函式中的 root.mainloop() 行,然后再次運行它 - 這次將顯示 Entry 小部件 textvariable。謝謝!
from tkinter import Tk, Toplevel, StringVar, Label
from tkinter import ttk
nameVariable = 'EntryBoxTextValue'
def frameWindow(root, nameVariable):
mainFrame = Toplevel(root)
mainFrame.grid()
nameLbl = Label(mainFrame, text="Name:", bg="white")
nameLbl.grid(row=0, column=0, sticky='w', pady=(10,5))
nameSV = StringVar()
nameSV.set(nameVariable)
nameEntry = ttk.Entry(mainFrame, textvariable=nameSV)
nameEntry.grid(row=0, column=1, columnspan=4, sticky='ew', pady=(10,5))
print(nameSV)
# root.mainloop()
if __name__ == '__main__':
root = Tk()
frameWindow(root, nameVariable)
root.mainloop()
請注意,其他小部件(如 ttk.Treeview 和 Text)無需在函式呼叫中運行 root.mainloop() 即可更新。
uj5u.com熱心網友回復:
一開始可能看起來有點奇怪,但我認為這與為什么tkinterimage 在函式內部不顯示而沒有保留任何 reference的原因相同。
所以問題可能是垃圾收集器nameSV在函式完成執行后進行清理,因為它不再在任何地方使用,但tk小部件仍在使用它。
解決方案很簡單,就像影像問題一樣,將變數設為全域變數或保留對它的其他參考。
def frameWindow(root, nameVariable):
global nameSV
...
...
或者在全域范圍內定義它:
if __name__ == '__main__':
root = Tk()
nameSV = StringVar() # Remove this line from inside the function
frameWindow(root, nameVariable)
root.mainloop()
如果您希望自己查看問題,可以在函式結束之前凍結腳本并強制處理事件并親自查看:
import time
...
...
def frameWindow(root, nameVariable):
mainFrame = Toplevel(root)
root.withdraw() # Hide root, to properly see the mainFrame window without root covering it
nameLbl = Label(mainFrame, text="Name:", bg="white")
nameLbl.grid(row=0, column=0, sticky='w', pady=(10,5))
nameSV = StringVar()
nameSV.set(nameVariable)
nameEntry = ttk.Entry(mainFrame, textvariable=nameSV)
nameEntry.grid(row=0, column=1, columnspan=4, sticky='ew', pady=(10,5))
root.update() # To draw the widget to the screen
time.sleep(5)
root.deiconify() # Bring the window back to close the root window and end the process
...
...
在前 5 秒內,您可以注意到條目中填充了正確的資料,但一旦結束并root彈出,條目就會變為空白。
在函式內部制作影像的情況下的解釋,也可以用來解釋這里的情況(來自effbot.org):
問題是 Tkinter/Tk 介面沒有正確處理對 Image 物件的參考;Tk 小部件將持有對內部物件的參考,但 Tkinter 沒有。當 Python 的垃圾收集器丟棄 Tkinter 物件時,Tkinter 告訴 Tk 釋放影像。但是由于影像正在被小部件使用,Tk 不會破壞它。不完全的。它只是使影像空白,使其完全透明……
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/422085.html
標籤:
上一篇:查找文本值并將其移動到不同的列
下一篇:更改一個比例小部件將更改第二個
