【问题标题】:Python: How to set function parameters by name with string [duplicate]Python:如何使用字符串按名称设置函数参数[重复]
【发布时间】:2026-02-03 16:10:01
【问题描述】:

我正在制作一个使用 tkinter 构建 GUI 应用程序的框架,在我的代码中,我有一个 Scene 类,它有一个 add(widget,params) 创建tkinter 小部件并将其添加到场景小部件字典的函数。 但是我只能添加一个我已经为其构建了add() 函数的小部件,因为不同的小部件具有不同的命名参数。

我将如何创建一个函数,该函数采用{paramName,value} 形式的字典,然后将其传递给小部件函数

例如

scene.add(button, {'command':Click, "text":"click me"} )

我当前的代码是

import tkinter as tk

class scene():
    def __init__(self, title, width, height):
        self.widgets = {}
        self.title = title
        self.width = width
        self.height = height

    def add(self, name, type, widget, root, params):
        if name in self.widgets.keys():
            return
        else:
            if type == "button":
                width = params[0]
                height = params[1]
                text = params[2]
                self.widgets[name] = [widget(root,width=width, height=height,text=text),params[2:]]

    def get(self,name):
        if name in self.widgets.keys():
            return self.widgets[name][0]

【问题讨论】:

  • 您可能想在此处查看已接受答案的方法 4 *.com/questions/62050496/…
  • 你知道**kwargs吗?
  • 您能否澄清您的哪些代码或描述是正确的?描述说你有Scene.add(self, widget, params),代码显示你有Scene.add(self, name, type, widget, root, params)。描述说你想传递“字典”{paramName,value} 这是一个集合,但代码显示了一个正确的字典。
  • 希望我正确理解了您的问题。如果重复项没有回答您试图询问的内容,请edit 澄清并像@tripleee 一样ping 我)删除重复项。
  • 抱歉重复我在搜索答案时找不到它

标签: python tkinter named-parameters


【解决方案1】:

您可以使用setattr。请参见下面的示例,其中我为“通用”字符串定义了一个 if 子句:

from tkinter import Tk, Button

class scene():
    def __init__(self, title, width, height):
        self.widgets = {}
        self.title = title
        self.width = width
        self.height = height

    def add(self, name, type, widget, root, params, attributes={}):
        if name in self.widgets.keys():
            return
        else:
            if type == "button":
                width = params[0]
                height = params[1]
                text = params[2]
                self.widgets[name] = [widget(root,width=width, height=height,text=text),params[2:]]
            elif type == "generic":
                width = params[0]
                height = params[1]
                text = params[2]
                widget_obj = widget(root,width=width, height=height,text=text)
                for key, val in attributes.items():
                    setattr(widget_obj, key, val)
                self.widgets[name]=[widget_obj,params[2:]]

    def get(self,name):
        if name in self.widgets.keys():
            return self.widgets[name][0]

# Create intance of tkinter
root = Tk(className = 'Python Examples - Window 0')
root.geometry("600x700")
root.resizable(0,0)

# Call class
sc=scene("Some title", 100, 100)
sc.add("button_widget", "button", Button, root, [10, 10, "some text"])
sc.add("button_widget2", "generic", Button, root, [10, 10, "some text"], {"command": "click", "text": "click me"})

【讨论】: