如何以Python方式将参数传递给子类化小部件的方法?

月刊

Label.pack()子类化为自动

import Tkinter as tk

class Label(tk.Label):
    def __init__(self, parent, *args, **kwargs):
        tk.Label.__init__(self, parent, *args, **kwargs)
        self.pack()

class App(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        l = Label(parent, text="word")

root = tk.Tk()
App(root).pack(side="top", fill="both", expand=True)
root.mainloop()

我希望能够.pack()在创建的实例时将参数传递给Label

正如上面所说,所有消息kwargs都传递给了父对象,tk.Label所以我无法将调用更新为l = Label(parent, text="word", side=tk.LEFT)(带有传递**kwargs的想法.pack())-由于tk.Frame.__init__side)和.pack()text的未知选项,程序将崩溃

唯一的想法,我必须克服这是手动调度论据kwargstk.Frame.__init__,并.pack()呼吁他们面前:

class Label(tk.Label):
    def __init__(self, parent, *args, **kwargs):
        # __init__ parameters
        initparms = dict()
        for p in ['text']:
            if kwargs.get(p):
                initparms[p] = kwargs.get(p)
        # pack parameters
        packparms = dict()
        for p in ['side']:
            if kwargs.get(p):
                packparms[p] = kwargs.get(p)
        tk.Label.__init__(self, parent, initparms)
        self.pack(packparms)

它可以工作,但是有没有更好的方法(= pythonic)来实现呢?

丹尼尔

如果您仅使用“文本”,则实际上并不需要每次都使用该列表。你可以做:

if 'text' in kwargs:
    initparms['text'] = kwargs['text']

这会使事情变得更好。

因此,如果您想一次做一大堆:

for param in ['text', 'another', 'option']:
    if param in kwargs:
        initparms[param] = kwargs[param]

.get()这里不需要额外的电话。

从Python 2.7开始,您实际上可以使用以下方法一次创建列表:

{key:value for key,value in ...}

句法。所以:

initparms = {k:v for k,v in kwargs.items()
             if k in ['text','and','other','valid','params']}

但是,这有点丑陋,将这样的东西放在执行其他操作的函数中间有点不友好。

通常,将事物分开以使函数更小是一个好主意。

VALID_LABEL_OPTIONS=['text', 'and', 'so', 'on']
VALID_PACK_OPTIONS = ['side', 'etc']

def extract_args(all_args, valid_keys):
    return {k:v for k,v in all_args.items()
            if k in valid_keys}

然后在您的__init__函数中,您可以执行以下操作:

initparms = extract_args(kwargs, VALID_LABEL_OPTIONS)
packparms = extract_args(kwargs, VALID_PACK_OPTIONS)

这使逻辑的每个部分保持独立。

这有帮助吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将方法作为参数传递给小部件

如何将小部件构造函数作为参数传递给另一个小部件来构建

Flutter/Dart:将参数传递给有状态小部件?

将参数传递给Flutter中的无状态小部件

将参数传递给可重用的小部件

durandal,在导航期间将参数传递给小部件

如何在Flutter中将参数传递给小部件

如何将QEvents传递给子窗口小部件?

在 Flutter 中如何将值传递给小部件

您如何以编程方式将参数传递给Blaze组件?

如何以编程方式将参数传递给angular2 +中的辅助路径?

如何以 Pythonic 方式将默认参数传递给子函数?

如何以编程方式为UINavigationController子类化UINavigationBar?

如何将变量作为参数传递给小部件二,在那里修改它,并将修改后的值返回给小部件一,Flutter

当我的小部件使用字符串ID进行引用时,如何将参数传递给有状态的小部件?

如何将子类的函数名称作为参数传递给python中的父类方法?

如何以正确的方式将结构的数组传递给函数?

如何以特定格式将文件作为参数传递给Python中的参数?

将子类传递给方法,但将超类作为参数?

将默认参数传递给子类的更好方法

如何将UIButton子类化以通过addTarget:action:forControlEvents传递多个NSString参数

如何将参数传递给BroadcastReceiver的子类?

从Tkinter中的Entry小部件将参数传递给动态创建的Button

子类化小部件以覆盖方法,同时保留原始方法的功能

如何将数据传递给另一个小部件内的小部件

如何以闪亮的方式内联显示小部件

将参数传递给BroadcastReceiver子类-Android

如何在没有子类化的情况下为 QTextEdit 小部件定义 mousePressEvent 函数?

Python:以pythonic方式将多个参数从函数传递给函数