Виджет Listbox

От класса Listbox создаются списки – виджеты, внутри которых в столбик перечисляются элементы. При этом можно выбирать один или множество элементов списка.

В Tkinter сначала создается экземпляр Listbox, после этого он заполняется с помощью метода insert().

Listbox

Первым аргументом в insert() передается индекс места, куда будет вставлен элемент. Если нужно вставлять в конец списка, то индекс обозначают константой END. Вторым аргументом передается вставляемый элемент.

По-умолчанию в Listbox, кликая мышкой, можно выбирать только один элемент. Если необходимо обеспечить множественный выбор, то для свойства selectmode можно установить значение EXTENDED. В этом режиме можно выбрать сколь угодно элементов, зажав Ctrl или Shift.

Если для Listbox необходим скроллер, то он настраивается также как для текстового поля. В программу добавляется виджет Scrollbar и связывается с экземпляром Listbox.

С помощью метода get() из списка можно получить один элемент по индексу, или срез, если указать два индекса. Метод delete() удаляет один элемент или срез.

Метод curselection() позволяет получить в виде кортежа индексы выбранных элементов экземпляра Listbox.

Ниже приводится пример программы, иллюстрирующей применение методов get(), insert(), delete() и curselection() класса Listbox. Первая кнопка добавляет введенную пользователем в текстовое поле строку в список, вторая кнопка удаляет выбранные элементы из списка, третья – сохраняет список в файл.

Методы Listbox

from tkinter import *
 
def addItem():
    lbox.insert(END, entry.get())
    entry.delete(0, END)
 
def delList():
    select = list(lbox.curselection())
    select.reverse()
    for i in select:
        lbox.delete(i)
 
def saveList():
    f = open('list000.txt', 'w')
    f.writelines("\n".join(lbox.get(0, END)))
    f.close()
 
root = Tk()
 
lbox = Listbox(selectmode=EXTENDED)
lbox.pack(side=LEFT)
scroll = Scrollbar(command=lbox.yview)
scroll.pack(side=LEFT, fill=Y)
lbox.config(yscrollcommand=scroll.set)
 
f = Frame()
f.pack(side=LEFT, padx=10)
entry = Entry(f)
entry.pack(anchor=N)
badd = Button(f, text="Add", command=addItem)
badd.pack(fill=X)
bdel = Button(f, text="Delete", command=delList)
bdel.pack(fill=X)
bsave = Button(f, text="Save", command=saveList)
bsave.pack(fill=X)
 
root.mainloop()

В функции delList() кортеж выбранных элементов превращается в список, после чего выполняется его реверс, т. е. переворот. Это делается для того, чтобы удаление элементов происходило с конца списка. Иначе программа бы неверно работала, так как удаление элемента приводило бы к изменению индексов всех следующих за ним. Если же удалять с конца, то индексы впереди стоящих не меняются.

В функции saveList() кортеж строк-элементов, который вернул метод get(), преобразуется в одну строку с помощью строкового метода join() через разделитель '\n'. Это делается для того, чтобы элементы списка записались в файл столбиком.

Listbox – достаточно сложный виджет. Кроме рассмотренных он обладает другими методами, а также множеством свойств.

Практическая работа

Напишите программу, состоящую из двух списков Listbox. В первом будет, например, перечень товаров, заданный программно. Второй изначально пуст, пусть это будет перечень покупок. При клике на одну кнопку товар должен переходить из одного списка в другой. При клике на вторую кнопку – возвращаться (человек передумал покупать). Предусмотрите возможность множественного выбора элементов списка и их перемещения.

Пример использования списка

Курс с примерами решений практических работ: android-приложение, pdf-версия.

Комментарии

Решение практической работы:
prod_two = Listbox(width=25,height=10, selectmode=EXTENDED)
for i in ("Молоко", "Колбоса", "Котлетки", "С пюрешкой", "Г"):
	prod_two.insert(0,i)
def vlev():
	pr1 = prod_two.curselection()
	pr2 = prod_two.get(pr1)
	prod_one.insert(END,pr2)
	prod_two.delete(pr1)
def vprav():
	pr1 = prod_one.curselection()
	pr2 = prod_one.get(pr1)
	prod_two.insert(END,pr2)
	prod_one.delete(pr1)
butt_one = Button(text="<<<", width=5,height=1, command=vlev)
butt_two = Button(text=">>>", width=5,height=1, command=vprav)
prod_one.pack(side=LEFT)
prod_two.pack(side=RIGHT)
butt_one.pack()
butt_two.pack()
root.mainloop()

Практическая работа.
from tkinter import *
root=Tk()
 
def to_box_2():
    select=list(box_1.curselection())
    select.reverse()
    for i in select:
        box_2.insert(END, box_1.get(i))
        box_1.delete(i)
 
 
def to_box_1():
    select=list(box_2.curselection())
    select.reverse()
    for i in select:
        box_1.insert(END, box_2.get(i))
        box_2.delete(i)
 
 
box_1=Listbox(selectmode=EXTENDED)
box_1.pack(side=LEFT)
products=["apple", "banana","carrot", "bread", "butter", "meat", "potato", "pineapple", "milk", "tomato"]
for p in products:
    box_1.insert(END, p)
scroll=Scrollbar(command=box_1.yview)
scroll.pack(side=LEFT, fill=Y)
box_1.config(yscrollcommand=scroll.set)
 
f=Frame()
f.pack(side=LEFT)
 
Button(f, text=">>>", command=to_box_2). pack()
Button(f, text="<<<", command=to_box_1).pack()
box_2=Listbox(selectmode=EXTENDED)
box_2.pack(side=LEFT)
scroll=Scrollbar(command=box_2.yview)
scroll.pack(side=LEFT, fill=Y)
box_2.config(yscrollcommand=scroll.set)
 
root.mainloop()

Ответ на от AnnaKo

from tkinter import *
def Add_purchase():
    select =  list(lbx.curselection())
    for i in select:
        lbx1.insert(END, lbx.get(i))
        lbx.delete(i)
def Remove_purchase():
    select =  list(lbx1.curselection())
    for i in select:
        lbx.insert(END, lbx1.get(i))
        lbx1.delete(i)
 
 
root = Tk()
f_l = Frame()
f_l.pack(side = LEFT)
f_c = Frame()
f_c.pack(side = LEFT)
f_r = Frame()
f_r.pack(side = LEFT)
lbx = Listbox(f_l, selectmode = EXTENDED)
lbx.pack(side = LEFT)
lbx1 = Listbox(f_r, selectmode = EXTENDED)
lbx1.pack(side = LEFT)
scrl = Scrollbar(command = lbx.yview)
scrl.pack(side=RIGHT, fill=Y)
btn = Button(f_c, text='>>>',width=3,height=1,command=Add_purchase)
btn1 = Button(f_c, text='<<<',width=3,height=1,command=Remove_purchase)
btn.pack()
btn1.pack()
lst = ['apple', 'bananas', 'carrot', 'bread', 'butter', 'meat', 'potato', 'pineaple']
for i in lst:
    lbx.insert(0,i)
 
root.mainloop()

from tkinter import *
 
 
def order():
    select = list(product_list.curselection())
    select.reverse()
    for i in select:
        shopping_list.insert(0, product_list.get(i))
        product_list.delete(i)
 
#  Sorting the list of goods alphabetically.
    l = list(shopping_list.get(0, END))
    l.sort()
    shopping_list.delete(0, END)
    for product in l:
        shopping_list.insert(END, product)
 
 
def delete():
    select = list(shopping_list.curselection())
    select.reverse()
    for i in select:
        product_list.insert(0, shopping_list.get(i))
        shopping_list.delete(i)
 
#  Sorting the list of goods alphabetically.
    l = list(product_list.get(0, END))
    l.sort()
    product_list.delete(0, END)
    for product in l:
        product_list.insert(END, product)
 
 
root = Tk()
root.title("Listbox")
 
frame = Frame()
 
product_list = Listbox(font="Courier 12", bg='#ADD8E6',
                       fg='#191970', selectmode=EXTENDED)
for i in (' apple', ' butter', ' cheese', ' chicken', ' fish', ' jam', 
          ' juice', ' lemon', ' meat', ' milk', ' tea', ' tomato', ' water'):
    product_list.insert(END, i)
 
shopping_list = Listbox(font="Courier 12", bg='#ADD8E6', fg='#191970', 
                        selectmode=EXTENDED)
 
scroll_product_list = Scrollbar(command=product_list.yview)
scroll_shopping_list = Scrollbar(command=shopping_list.yview) 
 
product_list.config(yscrollcommand=scroll_product_list.set)
shopping_list.config(yscrollcommand=scroll_shopping_list.set)
 
order_button = Button(frame, width=10, text="Order >>", font=18, command=order)
delete_button = Button(frame, width=10, font=18, text="<< Return", command=delete)
 
product_list.pack(side=LEFT, expand=1, fill=BOTH)
scroll_product_list.pack(side=LEFT, fill=Y)
frame.pack(padx=1, side=LEFT, expand=1, fill=BOTH)
order_button.pack(expand=1, fill=X)
delete_button.pack(expand=1, fill=X)
scroll_shopping_list.pack(side=LEFT, fill=Y)
shopping_list.pack(side=LEFT, expand=1, fill=BOTH)
 
root.mainloop()

from tkinter import *
root = Tk()
fr1 = Frame()
fr2 = Frame()
fr3 = Frame()
 
fruits = ['apple',"bananas","carrot","bread","butter","meat","milk","potato","pineapple"]
fruits2 = []
 
def sel():
    if lBox.curselection() != '':
        a = list(lBox.curselection())
        a.reverse()
        for i in a:
            lBox2.insert(END,lBox.get(i))
            lBox.delete(i)
def sel2():
    if lBox2.curselection() != '':
        a = list(lBox2.curselection())
        a.reverse()
        for i in a:
            lBox.insert(END,lBox2.get(i))
            lBox2.delete(i)
 
lBox = Listbox(fr1, selectmode = EXTENDED)
for i in fruits:
    lBox.insert(END,i)
b1 = Button(fr2,width = 10,text= '>>>', command = sel)
b2 = Button(fr2,width = 10,text= '<<<',command = sel2)
 
for i in fruits2:
    lBox.insert(END,i)
lBox2 = Listbox(fr3,selectmode = EXTENDED)
 
lBox.pack()
b1.pack()
b2.pack()
lBox2.pack()
 
fr1.pack(side = LEFT)
fr2.pack(side = LEFT)
fr3.pack(side = LEFT)
root.mainloop()

Ответ на от Павел

from tkinter import *
 
root = Tk()
 
 
def Vpravo():
    select = list(lbox1.curselection())
    select.reverse()
    for i in select:
        lbox2.insert(END, lbox1.get(i))
        lbox1.delete(i)
 
def Vlevo():
    select = list(lbox2.curselection())
    select.reverse()
    for i in select:
        lbox1.insert(END, lbox2.get(i))
        lbox2.delete(i)
 
f1=Frame()
lbox1 = Listbox(f1, selectmode=EXTENDED, width=15, height = 8)
f1.pack(side=LEFT)
lbox1.pack(side=LEFT, anchor=W)
 
f2=Frame()
toLeft = Button(f2, text='<<<', command=Vlevo)
toRight = Button(f2, text='>>>', command=Vpravo)
f2.pack(side=LEFT)
toLeft.pack()
toRight.pack()
 
f3=Frame()
lbox2 = Listbox(selectmode=EXTENDED,width=15, height = 8)
lbox2.pack(side= LEFT, anchor=E)
 
for i in range(10):
    lbox1.insert(END,i)
 
root.mainloop()

from tkinter import*
'''
List buys
'''
#Sort list
def sor():
    s = list(lbl.get(0, END))
    s1 = list(lbr.get(0, END))
    s.sort()
    s1.sort()
    lbl.delete(0, END)
    for product in s:
        lbl.insert(END, product)
 
    lbr.delete(0, END)
    for product in s1:
        lbr.insert(END, product)
 
#Event Button
def AddInList():
    select = list(lbl.curselection())
    select.reverse()
    for i in select:
        lbr.insert(END, lbl.get(i))
        lbl.delete(i)
    sor()
 
def DelInList():
    select = list(lbr.curselection())
    select.reverse()
    for i in select:
        lbl.insert(END, lbr.get(i))
        lbr.delete(i)
    sor()
 
# Main Window
root = Tk()
root.title('Покупки')
#Frame
f1 = Frame(root)
f1.pack(side=LEFT, fill=Y, expand=1)
f2 = Frame(root)
f2.pack(side=LEFT, fill=X, expand=1)
f3 = Frame(root)
f3.pack(side=RIGHT, fill=Y, expand=1)
 
 
#ListBox
lbl = Listbox(f1,selectmode=EXTENDED, width=30, height=10)
lbl.pack(expand=1, side=LEFT, fill=Y)
for i in ('apple', 'bananas', 'carrot', 'bread', 'butter', 'meat', 'potato', 'pineapple'):
    lbl.insert(END, i)
 
lbr = Listbox(f3,selectmode=EXTENDED, width=30, height=10)
lbr.pack(expand=1, side=RIGHT, fill=Y)
 
#Button
badd = Button(f2,text='>>>', width=5, height=1, command=AddInList)
badd.pack(padx=1, pady=25, expand=1, fill=X)
 
bdel = Button(f2,text='<<<', width=5, height=1, command=DelInList)
bdel.pack(padx=1, pady=25, expand=1, fill=X)
 
root.mainloop()

from tkinter import *
 
root=Tk()
root.title('Main Window')
 
def fromTO(event):
 
    if str(event.widget)[-6:]=='button':
        FROM=listBox2
        TO=listBox1
    else:
        FROM=listBox1
        TO=listBox2
    selectIndexes=list(FROM.curselection())
    selectIndexes.reverse()
    for i in selectIndexes:
        TO.insert(END, FROM.get(i))
        FROM.delete(i)
 
listBox1=Listbox(root, selectmode=EXTENDED)
listBox1.pack(side=LEFT, padx=10)
 
scroll_listBox1=Scrollbar(command=listBox1.yview)
scroll_listBox1.pack(side=LEFT, fill=Y)
listBox1.config(yscrollcommand=scroll_listBox1.set)
 
for i in ('макарошки','греча','кефир','вредное мясо','кура','газвода','хрен','хрень',
    'пакет','orbit','dirol',"wrigley's spearmint",'doublemint','juicy fruit','love is','wagon wheels'):
    listBox1.insert(0, i)
 
centralFrame=Frame(root)
centralFrame.pack(side=LEFT, padx=10)
 
btn1=Button(centralFrame, text='     <<<     ')
btn1.bind('<Button-1>', fromTO)
btn1.pack(side=TOP, pady=5, fill=X)
 
btn2=Button(centralFrame, text='>>>')
btn2.bind('<Button-1>', fromTO)
btn2.pack(side=TOP, fill=X)
 
listBox2=Listbox(root, selectmode=EXTENDED)
listBox2.pack(side=LEFT, padx=10)
 
scroll_listBox2=Scrollbar(command=listBox2.yview)
scroll_listBox2.pack(side=LEFT, fill=Y)
listBox2.config(yscrollcommand=scroll_listBox2.set)
 
root.mainloop()

Почему нельзя в определении кнопки задать функцию с параметрами, т.е. ...but1=Button(...command=move(but1,but2)) и but2=Button(...command=move(but2,but1)) и создать для них одну функцию move(источник, цель). Пришлось делать через функции-прокладки, а это как-то некрасиво!
from tkinter import *
root = Tk()
def univers(f,t):
    select = list(f.curselection())
    select.reverse()
    for i in select:
        t.insert(0, f.get(i))
        f.delete(i)
def move():
    univers(lbox1,lbox2)
def remove():
    univers(lbox2,lbox1)
left_frame = Frame(root);left_frame.pack(side=LEFT)
middle_frame = Frame(root);middle_frame.pack(side=LEFT)
right_frame = Frame(root);right_frame.pack(side=LEFT)
lbox1=Listbox(left_frame,width=20,height=8,selectmode=EXTENDED);lbox1.pack()
lbox2=Listbox(right_frame,width=20,height=8,selectmode=EXTENDED);lbox2.pack()
but1=Button(middle_frame,width=5,height=3,text='>>>',command=move);but1.pack()
but2=Button(middle_frame,width=5,height=3,text='<<<',command=remove);but2.pack()
 
S = ('red','green','blue','yellow')
for i in S:
    lbox1.insert(END,i)
 
root.mainloop()
<python>

Единственное со стрелочками не стал заморачиваться и выравнивать как на картинке )а так все работает как часы )
from tkinter import *
root = Tk()
list_of_products = ['apple', 'meet', 'juice', 'milk', 'eggs']#our products
 
 
 
def add_product():#func for add button
	selected_from_one = list(lbox1.curselection())
	for i in selected_from_one:
		lbox2.insert(END, lbox1.get(i))
 
def delete_product():#func for delete button
	selected = list(lbox2.curselection())
	selected.reverse()
	for i in selected:
		lbox2.delete(i)
 
frame = Frame()
 
lbox1 = Listbox(frame, selectmode = EXTENDED)#left listbox with products
lbox2 = Listbox(frame, selectmode = EXTENDED)#right listbox with our choises
but_add = Button(frame, text = '>>>', command = add_product)#add button
but_del = Button(frame, text = '<<<', command = delete_product)#delete button
 
frame.pack()
lbox1.pack(side = LEFT)
but_add.pack(side = LEFT)
but_del.pack(side = LEFT)
lbox2.pack(side = RIGHT)
 
for items in list_of_products:#adding products in left listbox
	lbox1.insert(0, items)
 
root.mainloop()

from tkinter import *
 
def list_init():
    lst = ["Яблоки","Бананы","Морковь","Хлеб","Масло","Мясо","Картошка","Персики","Помидоры","Молоко","Огурцы"]
    return lst
 
def add_sel():
    sel = list(lbox1.curselection())
    for i in sel:
        lbox2.insert(END,lbox1.get(i))
 
    sel.reverse()
    for i in sel:
        lbox1.delete(i)
 
def del_sel():
    sel = list(lbox2.curselection())
    for i in sel:
        lbox1.insert(END,lbox2.get(i))
 
    sel.reverse()
    for i in sel:
        lbox2.delete(i)
 
root = Tk()
 
lbox1 = Listbox(root,width = 20,height=10,selectmode = EXTENDED,font=("Tahoma",10))
lbox1.pack(side=LEFT)
 
scroll=Scrollbar(command=lbox1.yview)
scroll.pack(side=LEFT, fill=Y)
lbox1.config(yscrollcommand=scroll.set)
 
for i in list_init():
    lbox1.insert(END,i)
 
frm2 = Frame(root)
btn1 = Button(frm2,text = ">>>",command=add_sel)
btn1.grid(row=0,column = 1)
 
btn2 = Button(frm2,text = "<<<",command=del_sel)
btn2.grid(row=1,column = 1)
frm2.pack(side = LEFT)
 
lbox2 = Listbox(root,width = 20,height=10,selectmode = EXTENDED,font=("Tahoma",10))
lbox2.pack(side=LEFT)
 
scroll=Scrollbar(command=lbox2.yview)
scroll.pack(side=LEFT, fill=Y)
lbox2.config(yscrollcommand=scroll.set)
 
root.mainloop()

Чуть не сломал голову))
from tkinter import *
def Add_purchase():
    select =  list(lbx.curselection())
    for i in select:
        lbx1.insert(END, lst[i])
        lbx.delete(i)
def Remove_purchase():
    select =  list(lbx1.curselection())
    for i in select:
        lbx.insert(END, lst[i])
        lbx1.delete(i)
 
 
root = Tk()
f_l = Frame()
f_l.pack(side = LEFT)
f_c = Frame()
f_c.pack(side = LEFT)
f_r = Frame()
f_r.pack(side = LEFT)
lbx = Listbox(f_l, selectmode = EXTENDED)
lbx.pack(side = LEFT)
lbx1 = Listbox(f_r, selectmode = EXTENDED)
lbx1.pack(side = LEFT)
scrl = Scrollbar(command = lbx.yview)
scrl.pack(side=RIGHT, fill=Y)
btn = Button(f_c, text='>>>',width=3,height=1,command=Add_purchase)
btn1 = Button(f_c, text='<<<',width=3,height=1,command=Remove_purchase)
btn.pack()
btn1.pack()
lst = ['apple', 'bananas', 'carrot', 'bread', 'butter', 'meat', 'potato', 'pineaple']
for i in lst:
    lbx.insert(0,i)
 
root.mainloop()

#подключаем tkinter
import tkinter
#создаем главное окно
root = tkinter.Tk()
#инициализация переменных и констант
product_list = ("apple", "bananas", "carrot", "bread",
                "butter", "meat", "potato", "pineapple")
#создаем фреймы и виджеты
#
#фрейм с левым листбоксом
left_frame = tkinter.Frame(root)
#фрейм с двумя цетральными кнопками
center_frame = tkinter.Frame(root)
#фрейм с правым листбоксом
right_frame = tkinter.Frame(root)
#левый листбокс
listbox_left = tkinter.Listbox(left_frame,
                               width = 20,
                               height = 10,
                               selectmode = "extended")
#правый листбокс
listbox_right = tkinter.Listbox(right_frame,
                                width = 20,
                                height = 10,
                                selectmode = "extended")
#кнопка >>>
button_r = tkinter.Button(center_frame, width = 5, text = ">>>")
#кнопка <<<
button_l = tkinter.Button(center_frame, width = 5, text = "<<<")
#
#Форматируем методом pack
left_frame.pack(side = "left")
center_frame.pack(side = "left")
right_frame.pack(side = "left")
listbox_left.pack()
button_r.pack()
button_l.pack()
listbox_right.pack()
#заполняем левый листбокс списком
for i in product_list:
    listbox_left.insert(0, i)
#определяем функции
#
#кнопка >>>
def press_button_r(event):
    #получаем кортеж(номера элементов) выбранных продуктов из левого листбокса
    select = listbox_left.curselection()
    #идем по списку поочередно
    for i in select:
        #присваиваем каждый элемент списка правому листбоксу
        listbox_right.insert("end", listbox_left.get(i))
    #теперь так же удаляем из левого листбокса
    #счетчик удалений элементов
    count = 0
    for i in select:
        #первый элемент будет всегда равен "i", дальше элементы будут смещаться
        #при каждом удалении(count) на 1
        listbox_left.delete(i - count)
        count = count + 1
#кнопка <<< (по аналогии)
def press_button_l(event):
    select = listbox_right.curselection()
    for i in select:
        listbox_left.insert("end", listbox_right.get(i))
    count = 0
    for i in select:
        listbox_right.delete(i - count)
        count = count + 1
#события
#
#нажатие кнопки >>>
button_r.bind("<Button-1>", press_button_r)
#нажатие кнопки <<<
button_l.bind("<Button-1>", press_button_l)
#ожидание событий
root.mainloop()

from tkinter import *
tk = Tk()
tk.geometry('400x164')
tk.resizable(0,0)
pr = ['молоко','хлеб','колбаса','чай','котлеты','яблоко','пицца','помидор','какао','кофе',]
pr2=[]
l=Listbox(selectmode=EXTENDED)
l2=Listbox(selectmode=EXTENDED)
def right():
    try:
        s = list(l2.curselection())
        s.reverse()
        for i in s:
            l.insert(0, l2.get(i))
            l2.delete(i)
    except(IndexError):
        pass
def left():
    try:
        s = list(l.curselection())
        s.reverse()
        for i in s:
            l2.insert(0, l.get(i))
            l.delete(i)
    except(IndexError):
        pass
for p in pr:
    l.insert(END, p)
for p2 in pr2:
    l2.insert(END, p2)
btn = Button(text="<<<",command=up)
btn2 = Button(text=">>>",command=down)
l.pack()
l2.pack()
btn.pack()
btn2.pack()
l.place(x=0,y=0)
l2.place(x=276,y=0)

from tkinter import *
tk = Tk()
tk.geometry('416x164')
#tk.resizable(0,0)
pr = ['молоко','хлеб','колбаса','чай','котлеты','яблоко','пицца','помидор','какао','кофе','арбуз','дыня','сок','пирог']
pr2=[]
scr=Scrollbar(tk)
scr.pack(side=RIGHT, fill=Y)
scr2=Scrollbar(tk)
scr2.pack(side=LEFT, fill=Y)
l=Listbox(selectmode=EXTENDED,yscrollcommand=scr2.set)
l2=Listbox(selectmode=EXTENDED,yscrollcommand=scr.set)
def right():
    try:
        s = list(l2.curselection())
        s.reverse()
        for i in s:
            l.insert(0, l2.get(i))
            l2.delete(i)
    except(IndexError):
        pass
def left():
    try:
        s = list(l.curselection())
        s.reverse()
        for i in s:
            l2.insert(0, l.get(i))
            l.delete(i)
    except(IndexError):
        pass
for p in pr:
    l.insert(END, p)
for p2 in pr2:
    l2.insert(END, p2)
btn = Button(text="<<<",command=right)
btn2 = Button(text=">>>",command=left)
l.pack()
l2.pack()
btn.pack()
btn2.pack()
l.place(x=16,y=0)
l2.place(x=276,y=0)
scr.config(command=l2.yview)
scr2.config(command=l.yview)