如何在Tkinter不同类中操作实例化Listbox并解决调用方法报错问题
错误原因
你触发报错的直接原因是调用实例方法的方式错误:delete是Frame_class的实例方法,调用时必须传入Frame_class的实例对象作为第一个参数,你直接写Frame_class.delete(1)会把传入的1识别为self参数,所以系统会提示缺少必填的number参数。
现有代码结构问题
你的类继承设计存在冗余错误:Listbox_class和Spinbox_class不需要继承Frame_class,属于不必要的多重继承,反而会打乱实例间的引用关系。这两个组件的master就是Frame_class的实例,直接通过self.master就能访问父容器的属性和方法。
另外Frame初始化时的传参存在语法错误,kwargs前缺少**,会导致关键字参数传递失败。
需求实现说明
- 要在
Frame_class的__init__中获取Listbox第一项的数值,直接调用self.listbox.get(0)即可,删除第一项直接调用自身的self.delete(2)方法即可。 - 要在Spinbox中清空Listbox,直接通过
self.master.delete(1)调用父容器的删除方法即可。
修正后的完整代码
from tkinter import * class Frame_class(Frame): def __init__(self, parents, *args, **kwargs): # 修正kwargs传参错误 Frame.__init__(self, parents, *args, **kwargs) self.listbox = Listbox_class(self, width=11, height=1) self.listbox.pack() self.spinbox = Spinbox_class(self, width=11) self.spinbox.pack() # 此处获取listbox第一项的数值示例 first_item = self.listbox.get(0) print(f"Listbox第一项内容为:{first_item}") # 此处删除第一项示例,需要时取消注释即可 # self.delete(2) def delete(self, number): if number == 1: self.listbox.delete(0, END) if number == 2: self.listbox.delete(0, 1) # 移除不必要的Frame_class继承 class Listbox_class(Listbox): def __init__(self, master, **kwargs): Listbox.__init__(self, master, **kwargs) self.config(font=('Calibri',9,'bold')) self.insert(0, 'banana1') self.insert(0, 'orange1') # 移除不必要的Frame_class继承 class Spinbox_class(Spinbox): def __init__(self, master, **kwargs): Spinbox.__init__(self, master, **kwargs) self.var = StringVar() self.val = [1,2,3,4,5,6,7,8,9] self.config(font=('Calibri',9,'bold'), textvariable=self.var, values=self.val) self.var.trace_add('write', self.change) def change(self, *args): spinbox_val = self.get() if spinbox_val == '': # 调用父容器Frame_class实例的delete方法 self.master.delete(1) else: pass root = Tk() root.geometry('250x130+100+100') app = Frame_class(root) app.pack() root.mainloop()
内容的提问来源于stack exchange,提问作者Jackie Ck
相关产品推荐
相关产品推荐

