las6040 发表于 2023-5-28 17:29:12

函数调用

请大神帮忙解决,万分感谢!!
代码:
from tkinter import *
from tkinter import ttk

def go(n=None):
    if n==None:
      n=int(com.get())
      print(n^2)
    else:
      print(n*2)

root=Tk()
com=ttk.Combobox(root,width=10)
com.pack()
com['values']=
com.current(0)
com.bind('<<ComboboxSelected>>',go)
bnt=Button(root,text='Run',command=lambda x=10: go(x))
bnt.pack()
root.mainloop()

我的问题是,当使用列表控件触发函数时,会报错,报错信息:
TypeError: unsupported operand type(s) for *: 'Event' and 'int'
用按钮控件调用时输出正常:20

我的问题是:如果分别写两个函数,一个用于com控件的“选中”触发,而另一个函数用于按钮控件调用是没问题的,那么,如果只用这一个函数来实现两类控件的调用该如何实现?

陶远航 发表于 2023-5-28 17:34:40

这个错误是由于在绑定 <<ComboboxSelected>> 事件时,传递了一个 event 参数,而在 go 函数中未处理该参数,导致出现类型不匹配的错误。

要解决这个问题,可以在 go 函数定义时为 n 参数添加默认值 None,然后进行判断。如果 n 值为 None,说明是通过选中 com 控件触发的函数,此时可以从 com 控件获取选中的值,进行平方操作;否则说明是通过点击按钮触发的函数,此时直接对 n 进行双倍操作即可。

修改后的代码如下所示:

from tkinter import *
from tkinter import ttk

def go(n=None, event=None):
    if n is None:
      n = int(com.get())
      print(n ** 2)
    else:
      print(n * 2)

root=Tk()
com=ttk.Combobox(root,width=10)
com.pack()
com['values']=
com.current(0)
com.bind('<<ComboboxSelected>>',go)
bnt=Button(root,text='Run',command=lambda x=10: go(x))
bnt.pack()
root.mainloop()
这样修改后,无论是从 com 控件触发还是从按钮控件触发,都会调用同一个 go 函数,并且输出结果都是正确的。

isdkz 发表于 2023-5-28 17:36:00

当你绑定一个事件到 tkinter 控件时,回调函数会自动接收一个参数,这是一个Event对象,你不能将其用于数学运算。

在你的情况中,当你从 ComboBox 中选择一个选项时, go函数将会被调用,并且它会接收一个Event对象作为参数,然后你试图将这个Event对象与2进行乘法运算,这就导致了你所看到的错误。

为了解决这个问题,你可以检查参数的类型,如果是Event对象,则从 ComboBox 获取当前值;如果是int类型,则直接使用它进行运算。下面是修改后的go函数:

from tkinter import *
from tkinter import ttk

def go(n=None):
    if isinstance(n, Event):
      n = int(com.get())
      print(n**2)
    elif isinstance(n, int):
      print(n*2)

root=Tk()
com=ttk.Combobox(root,width=10)
com.pack()
com['values']=
com.current(0)
com.bind('<<ComboboxSelected>>',go)
bnt=Button(root,text='Run',command=lambda x=10: go(x))
bnt.pack()
root.mainloop()


这样就能成功地使用同一个函数来处理 ComboBox 的选中事件以及按钮的点击事件了。

las6040 发表于 2023-5-28 17:46:49

陶远航 发表于 2023-5-28 17:34
这个错误是由于在绑定事件时,传递了一个 event 参数,而在 go 函数中未处理该参数,导致出现类型不匹配 ...

按照您的代码运行后,还是报同样的错,isdkz的代码可以无误运行,谢谢您的耐心解答!

las6040 发表于 2023-5-28 17:48:15

isdkz 发表于 2023-5-28 17:36
当你绑定一个事件到 tkinter 控件时,回调函数会自动接收一个参数,这是一个Event对象,你不能将其用于 ...

谢谢大佬回复,已完美解决!!

isdkz 发表于 2023-5-28 17:48:53

las6040 发表于 2023-5-28 17:48
谢谢大佬回复,已完美解决!!

不客气{:5_109:}
页: [1]
查看完整版本: 函数调用