![](/img/trans.png)
[英]Tkinter Python: How to pass more than one argument through a lambda function in an OptionMenu
[英]How to pass data through a Tkinter button function, problems with lambda
起始頁有兩個按鈕:拉數據和在新框架中繪制數據。 figure(f,a) 已定義,但未包含在以下代碼部分中:
button1 = ttk.Button(self, text="Show Graph",
command=lambda: controller.show_frame(PageTwo))
button1.pack()
button2 = ttk.Button(self, text="PL3",
command=lambda: animate(3))
button2.pack()
Button2 啟動函數“animate”,它接受一個參數(J),提取對應於 J 的數據,然后繪制散點圖。
def animate(j)
a.plot(Date, Left,"go", label = "price")
title = "Left Fid"
a.set_title(title)
Button1 然后在新框架中顯示圖形
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Graph page", font=LARGE_FONT)
label.pack(pady=10,padx=10)
button1 = ttk.Button(self, text="back to home",
command=lambda: controller.show_frame(StartPage))
button1.pack()
canvas = FigureCanvasTkAgg(f,self)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand = True)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand = True)
問題:我想要繪制的數據正在由 animate.js 正確執行。 我可以在命令提示符中看到數據。 新的 tkinter 窗口彈出,但沒有繪制從“animate”生成的任何數據。
如果我從按鈕 2 中移除 LAMBDA,我會在新框架中看到正確的圖,但這不是我想為未來構建代碼的方式。 我無法刪除 lambda,因為最終會有 30 個按鈕,就像按鈕 2 一樣。
按鈕 2 中的 LAMBDA 發生了什么?
按鈕 2 中的 LAMBDA 發生了什么?
tkinter.Button
的命令參數需要對函數的引用。
lambda
是創建匿名、簡單函數的語法。 它的語法實際上與函數的簽名相同。
def func(a, *args, b = 2, **kwargs):
return a+b
func = lambda a, *args, b = 2, **kwargs: a+b
因為lambda
是一種創建函數的簡單方法,人們經常在tkinter
使用它來捆綁具有特定於給定回調/命令的預定參數的函數。
Button2 啟動函數“animate”,它接受一個參數(J),提取對應於 J 的數據,然后繪制散點圖。 [...]
Button1 然后在新框架中顯示圖形 [...]
如果我從按鈕 2 中移除 LAMBDA,我會在新框架中看到正確的圖
刪除lambda
關鍵字會在執行代碼以配置button2
而不是創建匿名函數時立即執行animate(3)
。 然后將button2
的命令設置為animate(3)
返回的任何內容。 如果它不可調用,那么它會被有效地忽略。
因為您沒有為animate
或controller.show_page
提供可行的代碼,所以我們中的任何人都無法確定它的作用,但從結果中可以安全地假設animate
將figure
存儲在屬性/變量中,並且然后controller.show_page
(或未提供的PageTwo
某些部分)從該屬性/變量中檢索figure
。 這就是代碼似乎仍然有效的原因:因為只有一個figure
要存儲, button1
將始終檢索正確的數字。 如果您有多個按鈕,則無論按下哪個按鈕, button1
可能始終顯示創建的最后一個按鈕的figure
,因為這是最近存儲的figure
。
顯然,這一切的中心問題可能是animate
如何存儲figure
以及controller.show_page
/ PageTwo
檢索圖形的方式。 兩種廣義的解釋:
PageOne
初始化之后或期間創建了一些與figure
交互(和/或影響PageTwo
的實例化)的東西。 使用lambda
,此對象在創建時具有特定值,該值在對象完成其進程(無論是初始化、調用后續方法、設置三級變量等)后才會更改。 如果沒有lambda
,則立即調用animate
,這會更改此對象以反映figure
的創建。figure
或另一個中間變量正在被垃圾收集,因為您沒有維護對它的引用。 由於我認為第一個更有可能,我會特別挑選a
和f
作為候選:這些變量都不是方法參數(並且它們似乎不是從controller
提取的,根據您的代碼),因此它們是引用在更高的范圍內執行期間可以輕松更改。
如果您將代碼簡化為 MVCE ,則更容易看出問題究竟是什么。 您還可能會發現在編寫 MVCE 時問題消失了,它會准確地告訴您出了什么問題,並讓您立即修復它,而不是等待 Stack Overflow 的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.