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()]
一个 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()]