获取Tkinter滑块值时触发TypeError错误的求助
解决Tkinter滑块回调函数参数缺失的报错问题
咱们先搞清楚报错的核心原因:Tkinter不同组件的回调规则不一样!
- 当你给
Scale(滑块)的command绑定函数时,滑块触发回调会自动把当前的滑块值作为参数传递给函数 - 但
Radiobutton(单选按钮)的command触发时,不会传递任何参数
你看你的第一段代码里,av_blur函数定义要求必须传入k参数:
def av_blur(k): ...
当拖动滑块时,滑块会主动传参数,函数能正常运行;但点击Average Blur单选按钮时,单选按钮没传参数,就会触发TypeError: av_blur() missing 1 required positional argument: 'k'这个错误。
再看你的简化示例,blurring函数没定义参数:
def blurring(): print(scale.get())
但滑块触发时会自动传参数进去,函数没接收,同样会报参数缺失的错。
针对你的代码,给两个具体解决方案:
方案1:让函数兼容有无参数的情况(适合单选按钮和滑块共用函数)
修改av_blur的定义,把k设为可选参数,当没有参数传入时,主动读取滑块的当前值:
def av_blur(k=None): global panelB # 如果是单选按钮触发的(k为None),就读取滑块的当前值 if k is None: k = blur_slide.get() k = int(k) dst_img = cv2.imread('result_img.jpg',0) dst_img = cv2.blur(dst_img,(5,5)) dst_img = cv2.blur(dst_img, (k, k)) # 后续的图像显示逻辑...
这样不管是滑块拖动(传k参数)还是单选按钮点击(不传参数),函数都能正常运行。
方案2:给单选按钮的command用lambda包装,手动传参数
如果你不想修改函数定义,可以给单选按钮的command用lambda表达式,手动传入当前滑块的值:
blur_rad1 = Radiobutton(br_frame, text='Average Blur', value=0, variable=blur_sel, command=lambda: av_blur(blur_slide.get()))
这样单选按钮点击时,会调用av_blur并传入滑块当前值,满足函数的参数要求。
针对你的简化示例的修复
简化示例里的blurring函数,有两种修复方式:
- 修改函数定义接收参数(可以直接用传进来的值,也可以忽略它直接读滑块):
def blurring(val): # val是滑块传过来的当前值,也可以忽略它直接调用scale.get() print(scale.get())
- 用lambda包装忽略参数,保持原函数不变:
scale = Scale(opt_frame,orient='horizontal', from_=0, to=128, command=lambda _: blurring())
另外还要提个你代码里的小bug:你重复定义了blur_sel,先是blur_sel = IntVar(),然后又blur_sel = 4,这会把之前的IntVar对象覆盖成整数,单选按钮的variable需要绑定IntVar对象,所以要删掉blur_sel = 4这行,改成blur_sel.set(4)来设置初始值。
内容的提问来源于stack exchange,提问作者nechi
相关产品推荐
相关产品推荐

