Setting a Tkinter variable throws the " TypeError: set() missing 1 required positional argument: value'" error message

Setting a Tkinter variable throws the " TypeError: set() missing 1 required positional argument: value'" error message

一个 Tkinter GUI,其中一堆 'visual effect' 类 调用控制面板生成器 它会生成一个由与效果参数关联的小部件组成的面板,以交互方式修改屏幕上的图像。

tkvars = [tk.IntVar, tk.DoubleVar, tk.BooleanVar, tk.StringVar] # Available Tk variable types

每个变量都要经过这个循环来得到正确类型的tk变量 为其预期的小部件。

val = 我要将变量设置为的值。需要的 Tk 变量的类型 该小部件基于该值的类型。

**if** ftype == 1:  ## CHECKBOX
    wvar = tkvars[2]     # Returns a BooleanVar
    wvar.**set**(val)
    **return** wvar          # Returns a Tk var of the correct type set to the correct value

**elif** ftype == 2:  ## RADIO
    wvar = tkvars[0]    # Returns an IntVar
    wvar.set(val)
    self._radiovar.**append**(wvar)
    **return** wvar          # Returns a Tk var of the correct type set to the correct value

**elif** ftype == 3:  ## SLIDERS
    if **str**(type(val)) in vartype: vix = vartype.**index**(str(type(val)))
    # The above line figures which type (int, float)  is required
    wvar = tkvars[vix]
    **print**(">>>>>>>>>>>>>>>SLIDER", tkvars[vix], vix, wvar, val)
    wvar.**set**(val)
    **return** wvar         # Throws an error message:
                        # ***TypeError: set() missing 1 required positional argument: value*'**

问题是,打印输出显示我正在尝试使用正确的值设置正确类型的 Tk 变量,但是我现在需要两个参数 Tk.variable**.set()** 方法。

我第一次得到它,我在 GUI 中设置并使用了数十种效果 类。这是完整的回溯消息:

Traceback (most recent call last):
  File "C:\Users\miche\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "D:/_DOCS/_CODE/ImProc/__PXL/PXL_5.py", line 10473, in clickend
    res = f.dialog()
  File "D:\_DOCS\_CODE\ImProc\__PXL\pxl_classesA.py", line 119871, in dialog
    ShapesFx.pages
  File "D:\_DOCS\_CODE\ImProc\__PXL\pxl_dialogs.py", line 6941, in __init__
    super(Dbuilder, self).__init__(parent, fields, caller, pages, isXpand, title)
  File "D:\_DOCS\_CODE\ImProc\__PXL\pxl_dialogs.py", line 732, in __init__
    self.initial_focus = self.body(body)
  File "D:\_DOCS\_CODE\ImProc\__PXL\pxl_dialogs.py", line 7024, in body
    wvar = self.getvars(parentframe, fix, item)
  File "D:\_DOCS\_CODE\ImProc\__PXL\pxl_dialogs.py", line 7227, in getvars
    wvar.set(val)
**TypeError: set() missing 1 required positional argument: 'value'**

考虑这段代码:

tkvars = [tk.IntVar, tk.DoubleVar, tk.BooleanVar, tk.StringVar] 

您正在创建 class 的列表,而不是变量。

错误的原因是您在 class 上调用方法而不是 class 的实例。与所有 python classes 一样,当您在实例上调用方法时 python 将自动传入 self 的值。由于您没有在实例上调用 set 方法,因此您的 val 被传递给 self 参数,因此没有参数作为值传递。

如果您希望将 class 变量放入您的列表中(而不是 class 的实例),您需要在设置值之前实例化 class。例如:

if ftype == 1:  ## CHECKBOX

    cls = tkvars[2]   # returns the variable class
    wvar = cls()      # instantiates the class
    wvar.set(val)     # sets the value of the instance
    return wvar       # returns the instance

注意:可以在实例化时设置值,节省一行代码:

wvar = cls(value=val)

如果您不需要每次运行此代码时都实例化一个新变量,您可以在初始化列表时实例化 classes:

tkvars = [tk.IntVar(), tk.DoubleVar(), tk.BooleanVar(), tk.StringVar()]