【问题标题】:Python: how to pass a function as a variable command in TkinterPython:如何在 Tkinter 中将函数作为变量命令传递
【发布时间】:2021-01-01 21:56:45
【问题描述】:

这是我第一次使用 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 行上打印“测试”。没啥事儿。为了测试代码,我将通用比例的命令替换为

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(parent,resolution=resolution, from_=start, to=end, orient=orient,length=lng,fg=clr,command=overlap_percent) NameError: name 'overlap_percent' 未定义

我无法完全弄清楚我做错了什么。如何使用通用比例函数来控制多个比例?

【问题讨论】:

  • 你在哪里修改了命令函数通用比例
  • 我修改了我的 OP 以突出我如何修改命令功能。
  • 如果overlap_percent() 在类中,则应使用self.overlap_percent
  • 所以你定义overlap_percent()是错误的,应该是def overlap_percent(self, value)
  • 您可以将一个额外的参数(例如name)传递给create_scale(...)def create_scale(..., cmdtrig, name):,并将名称传递给通用函数:tk.Scale(..., command=lambda v: cmdtrig(name, v)。然后定义像def some_function(self, scale_name, value):这样的通用函数。然后您可以创建诸如create_scale(..., self.some_function, 'scale1')create_scale(..., self.some_function, 'scale2') 等比例。

标签: python python-3.x tkinter


【解决方案1】:

在这条线上

OHA_scale = tk.Scale(parent,resolution=resolution, from_=start, to=end, 
orient=orient,length=lng,fg=clr,command=cmdtrig)

commandfunction 参数,但你发送 string

self.create_scale(Oliveframe,xval,yval,25,75,25,"vertical",75,90,'Black',overlap_percent)

如果你这样做了就没事了

【讨论】:

  • 在发布我的问题之前我确实尝试过。它最终出现错误 NameError: name 'overlap_percent' is not defined 类似于我在修改 scale 函数时在 OP 中显示的内容。我认为这可能是由于顺序。所以我玩弄了订单,仍然没有运气:(
  • 是的。我试过 self.overlap_percent 。这导致“ TypeError:overlap_percent() 接受 0 个位置参数,但给出了 2 个”。我不太明白 2 个参数是如何给出的。
猜你喜欢
  • 2021-11-21
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2015-02-16
相关资源
最近更新 更多