2017-01-08 59 views
0

我一直在試圖在tkinter中創建一個自定義小部件,沒有太花哨,只是一個框架,它擁有一個條目和兩個標籤。我希望標籤和框架能夠訪問父應用程序的StringVars(即兩個標籤的文本變量以及條目文本變量)。我認爲通過將這些名稱作爲關鍵字參數傳遞給初始化方法應該相當簡單,但我遇到了麻煩。這裏是我的代碼:tkinter:將初始化參數傳遞給子類自定義小部件?

import tkinter as tk 
import tkinter.ttk as ttk 

class EntryFrame(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 

     self.title = kwargs.get('title') 
     title = tk.Label(self, text=self.title) 
     unit = tk.Label(self, text='(Unit)') 
     self.entryVar = tk.StringVar() 
     entry = tk.Entry(self, textvariable=self.entryVar) 

     title.grid(row=0, column=0, sticky='es') 
     unit.grid(row=0, column=1, sticky='ws') 
     entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

class TestApplication(tk.Frame): 
    def __init__(self, master=None, *args, **kwargs): 
     tk.Frame.__init__(self, master=None, *args, **kwargs) 
     self.master=master 
     self.grid(row=0, column=0) 

     entryFrame = EntryFrame(self, title='Title') 
     entryFrame.grid(row=0, column=0) 

root = tk.Tk() 
Application = TestApplication(root) 
root.mainloop() 

我遇到一個問題,我無法真正傳遞任何東西到我的新的小工具,因爲它與tk.Frame初始化它似乎只屬性tk.frame初始時。我實際上不能給它args或kwargs。

如果我嘗試了不同的方法:

class EntryBox(self): 
    def __init__(self, parent, *args, **kwargs): 

     self.frame = tk.Frame(self) 
     self.title = tk.Label(self, text='Title') 
     self.unit = tk.Label(self, text='(Unit)') 
     self.entryVar = tk.StringVar() 
     entry = tk.Entry(self, textvariable=self.EntryVar) 

     title.grid(row=0, column=0, sticky='es') 
     unit.grid(row=0, column=1, sticky='es') 
     entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

類拋出未被定義的關於自我的錯誤。

編輯:

代碼示例2的一個更好的例子:

class EntryBox(): 
    def __init__(self, parent, *args, **kwargs): 

     self.title=kwargs.pop('title') 
     self.frame = tk.Frame(parent) 
     self.frame.grid(row=0, column=0) 
     self.title = tk.Label(self.frame, text=self.title) 
     self.unit = tk.Label(self.frame, text='(Unit)') 
     self.entryVar = tk.StringVar() 


     self.entry = tk.Entry(self.frame) 

     self.title.grid(row=0, column=0, sticky='es') 
     self.unit.grid(row=0, column=1, sticky='es') 
     self.entry.grid(row=1, column=0, columnspan=2, padx=3, pady=3, sticky='n') 

回答

1

試着這麼做:

def __init__(self, parent, title, **kwargs):   
    tk.Frame.__init__(self, parent, **kwargs) 
    self.title = title 

換句話說,避免將您的自定義參數的超類。

或者您可以在調用超類的__init__之前做self.title = kwargs.pop('title')

你的第二個代碼示例很簡單 - 在class EntryBox(self):,你期待'自我'是什麼?

+0

是的,第二個例子在再次查看之後還沒有完成。我已經做出調整並在上面發佈了更好的版本。沒有從tk.Frame繼承新類有什麼問題嗎? – Platytude

+0

子類化一個小部件通常會更方便 - 您可以直接向其中添加子項,或者配置像背景顏色之類的選項,而無需深入實例變量以獲取實際的小部件。然而,你的第二種方法沒有什麼根本性的錯誤。 – jasonharper

相關問題