2016-07-09 61 views
0

因此,在下面的代碼中,我在tkinter中建立一個Notebook。我從列表中抽取字符串VARS [「IMPS」],並使用字符串作爲鍵和框架作爲值在字典中創建頁面。迭代產生的Tkinter按鈕將不會響應正確的變量

我的問題來了,當我建立按鈕,按鈕激活的功能只是打印impname。但是,當應用程序構建時,標籤始終具有正確的內容和「impname」。筆記本的所有頁面上的按鈕始終打印列表中的最後一個字符串VARS [「IMPS」]。這是爲什麼發生?

Necromicon = ttk.Notebook(self) 
    self.pages = {} 
    for impname in __VARS__["IMPS"]: 
     page = {} 
     # Formate is Imp_acrobat.Imp() 
     # impname is a string 
     self.pages[impname] = page 
     self.pages[impname]["Page"] = ttk.Frame(Necromicon) 
     Necromicon.add(self.pages[impname]["Page"], text=impname[4:]) 
     x = ttk.Label(self.pages[impname]['Page'], text=impname) 
     x.config(wraplength=175, font=SMALL_FONT) 
     x.config(background='black', foreground='red') 
     self.pages[impname]['Scroll'] = x 
     self.pages[impname][impname + 'Button'] = tk.Button(
       self.pages[impname]['Page'], 
       text='Activate', 
       command=lambda: self.modload(self, controller, impname)) 
     self.pages[impname]['Scroll'].pack(fill="both", expand=True) 
     self.pages[impname][impname + 'Button'].pack() 

回答

0

要添加到我以前的答案,有關於的Python FAQ。

你的陳述

self.pages[impname][impname + 'Button'] = tk.Button(
      self.pages[impname]['Page'], 
      text='Activate', 
      command=lambda: self.modload(self, controller, impname)) 

相當於

def button_command(): return self.modload(self, controller, impname)) 
    self.pages[impname][impname + 'Button'] = tk.Button(
      self.pages[impname]['Page'], 
      text='Activate', 
      command=button_command) 

這是否使之更清楚每個button_handler()做同樣的事情? 事實上,我會建議修改你的代碼

def button_command(self=self, controller=controller, impname=impname): 
     return self.modload(self, controller, impname)) 
    self.pages[impname][impname + 'Button'] = tk.Button(
      self.pages[impname]['Page'], 
      text='Activate', 
      command=button_command) 

現在每個按鈕命令是不同的,因爲在函數定義的時候默認ARG遊戲計算。在創建按鈕之前,我總是定義按鈕命令。減少混淆。