You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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前缺少**,会导致关键字参数传递失败。

需求实现说明
  1. 要在Frame_class的__init__中获取Listbox第一项的数值,直接调用self.listbox.get(0)即可,删除第一项直接调用自身的self.delete(2)方法即可。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:21:00