Tkinter按钮调用带参函数时为何提示缺少位置参数?
问题原因与解决办法
核心错误点
重复定义控件覆盖了正确的lambda绑定
你在代码里两次定义了flatsLabel、flatsText、flatsEntry和browseflats,后面的代码直接覆盖了前面用lambda绑定参数的按钮,最终按钮绑定的是self.uploadFlats(不带参数),但这个方法要求传入entry参数,点击时自然会报参数缺失的错误。StringVar.set方法调用错误
uploadFlats里的entry.set(0, self.directory)写法不对,StringVar的set方法只需要传入要设置的字符串值,不需要索引参数。
修复后的代码调整
第一步:删除重复的flats控件定义
把这段重复的代码删掉:
self.flatsLabel = tk.Label(self.firstFrame, text = "Please enter flats directory: ") self.flatsText = tk.StringVar() self.flatsEntry = tk.Entry(self.firstFrame, width = 50, textvariable = self.flatsText) self.browseflats = tk.Button(self.firstFrame, text = "Browse", command = self.uploadFlats)
第二步:修正uploadFlats方法
把entry.set(0, self.directory)改成entry.set(self.directory):
def uploadFlats(self, entry): self.directory = dlg.askdirectory() entry.set(self.directory)
可选优化:统一方法风格(避免参数传递)
如果你想和uploadDarks、uploadBias保持一致,也可以让uploadFlats直接操作实例变量,不用传参数,这样按钮绑定更简单:
# 按钮绑定改成这样 self.browseflats = tk.Button(self.firstFrame, text = "Browse", command = self.uploadFlats) # 对应的uploadFlats方法修改为 def uploadFlats(self): self.directory = dlg.askdirectory() self.flatsEntry.delete(0, 'end') self.flatsEntry.insert(0, self.directory)
这样调整后,点击Browse按钮就能正常选择目录并填充到输入框里了。
内容的提问来源于stack exchange,提问作者Malcolm
相关产品推荐
相关产品推荐

