如何以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条评论
登录后参与评论

相关文章

来自分类Dev

如何将参数传递给小部件js资产?

来自分类Dev

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

来自分类Dev

将参数传递给QStackedWidget中的小部件的构造函数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何将参数传递给DOJO中的自定义小部件?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何以编程方式更改布局中小部件的顺序?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何将事件类型传递给具有块模式的小部件?

来自分类Dev

我们如何将值传递给对话框小部件?

来自分类Dev

如何将值从主屏幕小部件传递给应用程序?

来自分类Dev

QTest无法将事件传递给子窗口小部件

来自分类Dev

将API(模型类)传递给小部件

来自分类Dev

将变量索引传递给Flutter小部件

来自分类Dev

QTest无法将事件传递给子窗口小部件

来自分类Dev

将小部件输入传递给 DatabaseHelperSource 文件

来自分类Dev

将函数传递给窗口小部件工厂窗口小部件,而不执行它

来自分类Dev

如何以编程方式将Qt小部件(QPushButton,QTextEdit,QLabel)添加到Qt Designer布局?

来自分类Dev

如何创建对象列表以传递给Flutter中的小部件?

来自分类Dev

如何以智能方式将系统属性传递给Gradle中的测试?

Related 相关文章

  1. 1

    如何将参数传递给小部件js资产?

  2. 2

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

  3. 3

    将参数传递给QStackedWidget中的小部件的构造函数

  4. 4

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

  5. 5

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

  6. 6

    如何将参数传递给DOJO中的自定义小部件?

  7. 7

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

  8. 8

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

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    如何以编程方式更改布局中小部件的顺序?

  15. 15

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

  16. 16

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

  17. 17

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

  18. 18

    如何将事件类型传递给具有块模式的小部件?

  19. 19

    我们如何将值传递给对话框小部件?

  20. 20

    如何将值从主屏幕小部件传递给应用程序?

  21. 21

    QTest无法将事件传递给子窗口小部件

  22. 22

    将API(模型类)传递给小部件

  23. 23

    将变量索引传递给Flutter小部件

  24. 24

    QTest无法将事件传递给子窗口小部件

  25. 25

    将小部件输入传递给 DatabaseHelperSource 文件

  26. 26

    将函数传递给窗口小部件工厂窗口小部件,而不执行它

  27. 27

    如何以编程方式将Qt小部件(QPushButton,QTextEdit,QLabel)添加到Qt Designer布局?

  28. 28

    如何创建对象列表以传递给Flutter中的小部件?

  29. 29

    如何以智能方式将系统属性传递给Gradle中的测试?

热门标签

归档