首页 文章

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

提问于
浏览
0

我一直在尝试在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')

该类抛出关于self未定义的错误 .

编辑:

代码示例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 回答

  • 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): 中,您期望'self'是什么?

相关问题