|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请大神帮忙解决,万分感谢!!
代码:
- 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']=[x for x in range(1,11)]
- 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控件的“选中”触发,而另一个函数用于按钮控件调用是没问题的,那么,如果只用这一个函数来实现两类控件的调用该如何实现?
当你绑定一个事件到 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']=[x for x in range(1,11)]
- com.current(0)
- com.bind('<<ComboboxSelected>>',go)
- bnt=Button(root,text='Run',command=lambda x=10: go(x))
- bnt.pack()
- root.mainloop()
复制代码
这样就能成功地使用同一个函数来处理 ComboBox 的选中事件以及按钮的点击事件了。
|
|