我一直在尝试在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')
答案 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'是吗?