当前位置: 首页 > 知识库问答 >
问题:

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

云俊美
2023-03-14

我一直在尝试在tkinter中创建一个自定义小部件,没什么特别的,只是一个包含一个条目和两个标签的框架。我希望标签和框架能够访问父应用程序的StringVars(即两个标签的textvariable,以及条目textvariable)。我认为通过将这些名称作为关键字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初始化的。框架似乎只需要tk。初始化时的帧属性。我真的不能给它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个答案

闾丘晨
2023-03-14

尝试以下方法:

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

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

或者你可以自己做self。title=kwargs。在调用超类的\uuuu init\uuu之前,弹出('title')

您的第二个代码示例很简单-在类入口框(self):中,您希望“self”是什么?

 类似资料:
  • 使用,并希望将常量/参数传递给自定义映射器 我的目的地具有 Map 类型的字段

  • 问题内容: 这在Django 1.9中用form_kwargs修复。 我有一个看起来像这样的Django表单: 我称这种形式的东西是这样的: 登录用户在哪里。这按预期工作。 我的问题是,我现在想将此单一表单转换为表单集。我不知道的是在创建表单集时如何将会员信息传递给各个表单。根据文档来制作一个表单集,我需要做这样的事情: 然后我需要这样创建它: 现在如何以这种方式将affiliate = requ

  • 问题内容: 当我定义一个自定义类型时,基础类型的类型似乎对我是否可以按原样将其传递给函数还是需要对其进行转换有所不同。 问题是: 为什么和起作用,但不起作用? https://play.golang.org/p/buKNkrg5y- 在这里,当我运行此函数时,它会抱怨,尽管它是基础类型。但是当我打电话或他们成功运行时。 问题答案: 和 您的新类型是2种不同的不同类型。在预期的地方,您必须传递typ

  • 我目前正在使用环境变量向负载测试传递自定义参数。例如,我的测试类如下所示: 然后,我将使用以下工具运行测试: 有没有更多的方式可以将自定义参数传递给命令行应用程序?

  • 本文向大家介绍Swift使用参数自定义初始化,包括了Swift使用参数自定义初始化的使用技巧和注意事项,需要的朋友参考一下 示例 请注意,您不能省略参数标签: 为了允许省略参数标签,请使用下划线_作为标签: 如果参数标签使用一个或多个属性共享名称,请使用self显式设置属性值:            

  • 问题内容: 如何接受自定义类型查询参数? 上面的行在启动服务器时给出错误 问题答案: 查看有关注入的可接受类型的文档。(这同样适用于所有其他注释) 是原始类型 有一个接受单个String参数的构造函数 有一个名为或的静态方法,该方法接受单个String参数(例如,参见) 已注册ParamConverterProvider JAX-RS扩展SPI的实现,该扩展返回一个ParamConverter实例