Python:如何在Tkinter中将函数作为变量命令传递

Python:如何在Tkinter中将函数作为变量命令传递,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,这是我第一次使用Tkinter创建GUI来模拟DSP设置。我卡住了 此GUI需要多个缩放。因此,我编写了一个通用的比例函数 # Overlap percent scale def overlap_percent(): print("Testing") # op=var.get() # olive_features['overlap_perc']=op # generic scale function def create_scale(s

这是我第一次使用Tkinter创建GUI来模拟DSP设置。我卡住了

此GUI需要多个缩放。因此,我编写了一个通用的比例函数

# Overlap percent scale  
def overlap_percent():
    print("Testing")
    # op=var.get()
    # olive_features['overlap_perc']=op

    # generic scale function
def create_scale(self,parent,xval,yval,start,end,resolution,orient,default,lng,clr,cmdtrig):
    OHA_scale = tk.Scale(parent,resolution=resolution, from_=start, to=end, orient=orient,length=lng,fg=clr,command=cmdtrig)
    OHA_scale.grid(row=xval, column=yval, sticky=tk.E + tk.W + tk.N + tk.S, padx=20, pady=4)
    OHA_scale.set(default)


    # Overlap %
    yval=yval+2
    xval=1
    self.create_label(Oliveframe,xval,yval,"Overlap %")
    xval=3
    self.create_scale(Oliveframe,xval,yval,25,75,25,"vertical",75,90,'Black',"overlap_percent")
    xval=1
    yval=yval+1
    self.create_arrow(Oliveframe,xval,yval)
根据上面的代码,我想当我调整重叠比例时,它会在cmd行上打印“Testing”。什么也没发生。为了测试代码,我将命令替换为通用的scale To

def create_scale(self,parent,xval,yval,start,end,resolution,orient,default,lng,clr,cmdtrig):
    OHA_scale = tk.Scale(parent,resolution=resolution, from_=start, to=end, orient=orient,length=lng,fg=clr,command=overlap_percent)
这导致了一个错误

OHA_scale=tk.scale(父级,分辨率=分辨率,从=开始,到=结束,方向=方向,长度=液化天然气,fg=clr,命令=重叠百分比) NameError:未定义名称“重叠百分比”

我不太明白我做错了什么。如何准确地使用通用比例功能控制多个比例?

在这一行

OHA_scale = tk.Scale(parent,resolution=resolution, from_=start, to=end, 
orient=orient,length=lng,fg=clr,command=cmdtrig)
命令接受函数参数,但发送字符串值


如果你这样做了,那就没问题了。

你修改了命令函数的通用比例我修改了我的OP以突出显示我是如何修改命令函数的。如果
overlap\u percent()
在类中,那么应该使用
self.overlap\u percent
来代替。因此你定义的
overlap\u percent()
错误,应改为
def overlap\u percent(self,value)
。您可以将额外的参数(例如
name
)传递到
create\u scale(…)
def create\u scale(…,cmdtrig,name):
并将名称传递给泛型函数:
tk.scale(…,command=lambda v:cmdtrig(name,v)
。然后定义通用函数,如
def some\u函数(self,scale\u name,value):
。然后可以创建类似
create\u scale(…,self.some\u函数,'scale1')的缩放。
create\u scale(…,self.some\u函数,'scale2'))
等。在我发布问题之前,我确实试过了。结果出现了一个错误名称错误:名称“重叠百分比”的定义与我修改比例函数时在OP中显示的不一样。我认为这可能是由于顺序。因此我对顺序进行了调整,仍然没有运气:(是的。我尝试了self.overlap\u percent。这导致了“TypeError:overlap\u percent()接受0个位置参数,但给出了2个”。我不太明白2个参数是如何给出的。
self.create_scale(Oliveframe,xval,yval,25,75,25,"vertical",75,90,'Black',overlap_percent)