Python 如何在MultiListbox中添加标签

Python 如何在MultiListbox中添加标签,python,tkinter,Python,Tkinter,我想使用Multilistbox和Label创建一个表。我有一些代码,我尝试了很多次。但我不知道如何才能做到这一点。在我的表中,我想要三行六列,第一行包含一列,第二行包含三列,第三行包含六列 我的代码是这样工作的: 我的期望是这样的: 从tkinter导入* 类MultiListbox(框架): 定义初始化(自、主、列表): 帧。\uuuu初始化(自,主) self.lists=[] 对于列表中的l、w: 帧=帧(自身); frame.pack(侧面=左侧,展开=是,填充=两者) 标签(框架

我想使用Multilistbox和Label创建一个表。我有一些代码,我尝试了很多次。但我不知道如何才能做到这一点。在我的表中,我想要三行六列,第一行包含一列,第二行包含三列,第三行包含六列

我的代码是这样工作的:

我的期望是这样的:

从tkinter导入*
类MultiListbox(框架):
定义初始化(自、主、列表):
帧。\uuuu初始化(自,主)
self.lists=[]
对于列表中的l、w:
帧=帧(自身);
frame.pack(侧面=左侧,展开=是,填充=两者)
标签(框架,文本=l,边框宽度=1,浮雕=凸起)。包装(填充=X)
lb=列表框(边框,宽度=w,边框宽度=0,选择边框宽度=0,
浮雕=平坦,导出选择=假)
lb.pack(扩展=是,填充=两者)
self.lists.append(lb)
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind('',lambda e:'断裂')
lb.bind(“”,λe,s=自:s.b2;运动(e.x,e.y))
lb.bind(“”,λe,s=自身:s._按钮2(e.x,e.y))
帧=帧(自身);
框架包装(侧面=左侧,填充=Y)
标签(边框,边框宽度=1,浮雕=凸起)。包装(填充=X)
sb=滚动条(框架,方向=垂直,命令=自滚动)
sb.打包(扩展=是,填充=Y)
self.lists[0]['yscrollcommand']=sb.set
def_选择(自,y):
行=自身。列表[0]。最近的(y)
自选择\u清除(0,结束)
自选择集(行)
返回“中断”
def_按钮2(自身、x、y):
对于self.list中的l:l.scan_标记(x,y)
返回“中断”
def_b2运动(自、x、y):
对于self.list中的l:l.scan_dragto(x,y)
返回“中断”
def_滚动(自,*args):
对于self.List中的l:
应用(l.yview,args)
选举(自选):
返回self.lists[0].curselection()
def delete(自我、第一、最后=无):
对于self.List中的l:
l、 删除(第一个,最后一个)
def get(自我、第一、最后=无):
结果=[]
对于self.List中的l:
result.append(l.get(first,last))
如果最后一个:返回应用(映射,[无]+结果)
返回结果
def索引(自我,索引):
self.lists[0]。索引(index)
def插入(自、索引、*元素):
对于元素中的e:
i=0
对于self.List中的l:
l、 插入(索引,e[i])
i=i+1
def大小(自身):
返回self.lists[0].size()
def见(自我,索引):
对于self.List中的l:
l、 见(索引)
def选择_锚(自身,索引):
对于self.List中的l:
l、 选择锚(索引)
def选择_清除(自身、第一个、最后一个=无):
对于self.List中的l:
l、 选择\u清除(第一个、最后一个)
def选择_包括(自身、索引):
返回self.lists[0]。选择内容包括(索引)
def选择_设置(自身、第一个、最后一个=无):
对于self.List中的l:
l、 选择集(第一个、最后一个)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tk=tk()
标签(tk,text='MultiListbox').pack()
mlb=多列表框(tk,('Quantity',20),('Price',20),('Quantity',20),('Price',20),('Quantity',20),('Price',20),)
mlb.pack(扩展=是,填充=两者)
tk.mainloop()

对我来说,使用
网格
来组织类中的小部件
多列表框
,而不是
,似乎更有意义。这里稍作修改,您可以输入产品名称:

from tkinter import *

class MultiListbox(Frame):
    def __init__(self, master, lists):
        Frame.__init__(self, master)
        self.lists = []
        Label(self,text="Product Name",borderwidth=1,
              relief=RAISED).grid(row=0,column=0,columnspan=6,sticky="ew")
        for num, i in enumerate(("Product One","Product Two","Product Three"),0):
            Label(self,text=i,borderwidth=1,
              relief=RAISED).grid(row=1,column=num*2,columnspan=2,sticky="ew")
        for num, (l, w) in enumerate(lists):
            frame = Frame(self)
            frame.grid(row=2,column=num)
            Label(frame, text=l, borderwidth=1, relief=RAISED).grid(row=0,column=0,sticky="ew")
            lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
                         relief=FLAT, exportselection=FALSE)
            lb.grid(row=1,column=0)
            self.lists.append(lb)
            lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y))
            lb.bind('<Button-1>', lambda e, s=self: s._select(e.y))
            lb.bind('<Leave>', lambda e: 'break')
            lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y))
            lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y))
        Label(self, borderwidth=1, relief=RAISED, text=" ").grid(row=0,column=7,sticky="nesw",rowspan=3)
        sb = Scrollbar(self, orient=VERTICAL)
        sb.grid(row=2,column=7,sticky="ns")
        self.lists[0]['yscrollcommand'] = sb.set

if __name__ == '__main__':
    tk = Tk()
    Label(tk, text='MultiListbox').pack()
    mlb = MultiListbox(tk, (('Quantity', 20), ('Price', 20), ('Quantity', 20), ('Price', 20),('Quantity', 20), ('Price', 20),))
    mlb.pack(expand=YES, fill=BOTH)
    tk.mainloop()
从tkinter导入*
类MultiListbox(框架):
定义初始化(自、主、列表):
帧。\uuuu初始化(自,主)
self.lists=[]
标签(self,text=“产品名称”,borderwidth=1,
网格(行=0,列=0,列span=6,sticky=“ew”)
对于num,枚举中的i((“产品一”、“产品二”、“产品三”),0):
标签(self,text=i,borderwidth=1,
网格(行=1,列=num*2,列span=2,sticky=“ew”)
对于枚举(列表)中的num(l,w):
帧=帧(自身)
frame.grid(行=2,列=num)
标签(边框,文本=l,边框宽度=1,浮雕=凸起)。网格(行=0,列=0,sticky=“ew”)
lb=列表框(边框,宽度=w,边框宽度=0,选择边框宽度=0,
浮雕=平坦,导出选择=假)
lb.grid(行=1,列=0)
self.lists.append(lb)
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind(“”,λe,s=self:s.(选择(e.y))
lb.bind('',lambda e:'断裂')
lb.bind(“”,λe,s=自:s.b2;运动(e.x,e.y))
lb.bind(“”,λe,s=自身:s._按钮2(e.x,e.y))
标签(self,borderwidth=1,relief=凸起,text=”“).grid(行=0,列=7,sticky=“nesw”,行span=3)
sb=滚动条(自身,方向=垂直)
sb.网格(行=2,列=7,sticky=“ns”)
self.lists[0]['yscrollcommand']=sb.set
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
tk=tk()
标签(tk,text='MultiListbox').pack()
mlb=多列表框(tk,('Quantity',20),('Price',20),('Quantity',20),('Price',20),('Quantity',20),('Price',20),)
mlb.pack(扩展=是,填充=两者)
tk.mainloop()
from tkinter import *

class MultiListbox(Frame):
    def __init__(self, master, lists):
        Frame.__init__(self, master)
        self.lists = []
        Label(self,text="Product Name",borderwidth=1,
              relief=RAISED).grid(row=0,column=0,columnspan=6,sticky="ew")
        for num, i in enumerate(("Product One","Product Two","Product Three"),0):
            Label(self,text=i,borderwidth=1,
              relief=RAISED).grid(row=1,column=num*2,columnspan=2,sticky="ew")
        for num, (l, w) in enumerate(lists):
            frame = Frame(self)
            frame.grid(row=2,column=num)
            Label(frame, text=l, borderwidth=1, relief=RAISED).grid(row=0,column=0,sticky="ew")
            lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
                         relief=FLAT, exportselection=FALSE)
            lb.grid(row=1,column=0)
            self.lists.append(lb)
            lb.bind('<B1-Motion>', lambda e, s=self: s._select(e.y))
            lb.bind('<Button-1>', lambda e, s=self: s._select(e.y))
            lb.bind('<Leave>', lambda e: 'break')
            lb.bind('<B2-Motion>', lambda e, s=self: s._b2motion(e.x, e.y))
            lb.bind('<Button-2>', lambda e, s=self: s._button2(e.x, e.y))
        Label(self, borderwidth=1, relief=RAISED, text=" ").grid(row=0,column=7,sticky="nesw",rowspan=3)
        sb = Scrollbar(self, orient=VERTICAL)
        sb.grid(row=2,column=7,sticky="ns")
        self.lists[0]['yscrollcommand'] = sb.set

if __name__ == '__main__':
    tk = Tk()
    Label(tk, text='MultiListbox').pack()
    mlb = MultiListbox(tk, (('Quantity', 20), ('Price', 20), ('Quantity', 20), ('Price', 20),('Quantity', 20), ('Price', 20),))
    mlb.pack(expand=YES, fill=BOTH)
    tk.mainloop()