tkinter:将初始化参数传递给Subclassed自定义小部件?

时间:2017-01-08 20:12:47

标签: python tkinter kwargs

我一直在尝试在tkinter中创建一个自定义小部件,没有什么太花哨,只是一个包含条目和两个标签的框架。我希望标签和框架能够访问父应用程序的StringVars(即两个标签的文本变量,以及条目文本变量)。我认为通过将这些名称作为关键字args传递给初始化方法,这应该是相当简单的,但我遇到了麻烦。这是我的代码:

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 个答案:

答案 0 :(得分:1)

尝试类似:

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

换句话说,避免将自定义参数传递给超类。

或者你可以在调用超类self.title = kwargs.pop('title')之前__init__

你的第二个代码示例很简单 - 在class EntryBox(self):中,你期待什么' self'是吗?