簡體   English   中英

如何通過 Tkinter 按鈕功能傳遞數據,lambda 問題

[英]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)返回的任何內容。 如果它不可調用,那么它會被有效地忽略。

因為您沒有為animatecontroller.show_page提供可行的代碼,所以我們中的任何人都無法確定它的作用,但從結果中可以安全地假設animatefigure存儲在屬性/變量中,並且然后controller.show_page (或未提供的PageTwo某些部分)從該屬性/變量中檢索figure 這就是代碼似乎仍然有效的原因:因為只有一個figure要存儲, button1將始終檢索正確的數字。 如果您有多個按鈕,則無論按下哪個按鈕, button1可能始終顯示創建的最后一個按鈕的figure ,因為這是最近存儲的figure

顯然,這一切的中心問題可能是animate如何存儲figure以及controller.show_page / PageTwo檢索圖形的方式。 兩種廣義的解釋:

  • PageOne初始化之后或期間創建了一些與figure交互(和/或影響PageTwo的實例化)的東西。 使用lambda ,此對象在創建時具有特定值,該值在對象完成其進程(無論是初始化、調用后續方法、設置三級變量等)后才會更改。 如果沒有lambda ,則立即調用animate ,這會更改此對象以反映figure的創建。
  • 變量房屋figure或另一個中間變量正在被垃圾收集,因為您沒有維護對它的引用。

由於我認為第一個更有可能,我會特別挑選af作為候選:這些變量都不是方法參數(並且它們似乎不是從controller提取的,根據您的代碼),因此它們是引用在更高的范圍內執行期間可以輕松更改。

如果您將代碼簡化為 MVCE則更容易看出問題究竟是什么。 您還可能會發現在編寫 MVCE 時問題消失了,它會准確地告訴您出了什么問題,並讓您立即修復它,而不是等待 Stack Overflow 的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM