Метод pack()

Прежде чем продолжить знакомство с виджетами GUI остановимся на вопросе их расположения в окне. Это важный вопрос, так как от интуитивности интерфейса во многом зависит удобство использования программы. Организуя виджеты в пространстве, программист отчасти становится дизайнером, разработчиком интерфейсов.

В Tkinter существует три так называемых менеджера геометрии – упаковщик, сетка и размещение по координатам. В этом уроке будет рассмотрен первый как наиболее простой и часто используемый, остальные два упомянем позже.

Упаковщик (packer) вызывается методом pack(), который имеется у всех виджетов-объектов. Мы уже использовали его. Если к элементу интерфейса не применить какой-либо из менеджеров геометрии, то он не отобразится в окне. При этом в одном окне (или любом другом родительском виджете) нельзя комбинировать разные менеджеры. Если вы начали размещать виджеты методом pack(), то не надо тут же использовать методы grid() (сетка) и place() (место).

Если в упаковщики не передавать аргументы, то виджеты будут располагаться вертикально, друг над другом. Тот объект, который первым вызовет pack(), будет вверху. Который вторым – под первым, и так далее.

У метода pack() есть параметр side (сторона), который принимает одно из четырех значений-констант tkinter – TOP, BOTTOM, LEFT, RIGHT (верх, низ, лево, право). По умолчанию, когда в pack() не указывается side, его значение равняется TOP. Из-за этого виджеты располагаются вертикально.

Создадим четыре раскрашенные метки

… 
l1 = Label(width=7, height=4, bg='yellow', text="1")
l2 = Label(width=7, height=4, bg='orange', text="2")
l3 = Label(width=7, height=4, bg='lightgreen', text="3")
l4 = Label(width=7, height=4, bg='lightblue', text="4")

и рассмотрим разные комбинации значений сайда:

side=TOP
 

side=BOTTOM
 

side=LEFT
 

side=RIGHT
 

Разные значения опции side метода pack()
 

Разные значения опции side метода pack()

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

Фреймы размещают на главном окне, а уже в фреймах – виджеты:

from tkinter import *
root = Tk()
f_top = Frame(root) # root можно не указывать
f_bot = Frame(root)
l1 = Label(f_top, width=7, height=4, bg='yellow', text="1")
l2 = Label(f_top, width=7, height=4, bg='orange', text="2")
l3 = Label(f_bot, width=7, height=4, bg='lightgreen', text="3")
l4 = Label(f_bot, width=7, height=4, bg='lightblue', text="4")
 
f_top.pack()
f_bot.pack()
l1.pack(side=LEFT)
l2.pack(side=LEFT)
l3.pack(side=LEFT)
l4.pack(side=LEFT)
 
root.mainloop()

Результат:

Упаковка во фреймы

Кроме Frame существует похожий класс LabelFrame – фрейм с подписью. В отличие от простого фрейма у него есть свойство text.

… 
f_top = LabelFrame(text="Верх")
f_bot = LabelFrame(text="Низ")

Использование LabelFrame

Кроме side у pack() есть другие параметры-свойства. Можно задавать внутренние (ipadx и ipady) и внешние (padx и pady) отступы:

Опции padx и pady

Опции ipadx и ipady

Когда устанавливаются внутренние отступы, то из-за того, что side прибивает виджет к левой границе, справа получаем отступ в 20 пикселей, а слева – ничего. Можно частично решить проблему, заменив внутренние отступы рамки на внешние отступы у меток.

Установка отступов у метки

Но тут появляется промежуток между самими метками. Чтобы его убрать, пришлось бы каждый виджет укладывать в свой собственный фрейм. Отсюда делаем вывод, что упаковщик Tkinter удобен только для относительно простых интерфейсов.

Следующие два свойства – fill (заполнение) и expand (расширение). По-умолчанию expand равен нулю (другое значение – единица), а fill – NONE (другие значения BOTH, X, Y). Создадим окно с одной меткой:

from tkinter import *
root = Tk()
l1 = Label(bg="lightgreen", width=30, height=10, text="This is a label")
l1.pack()
root.mainloop()

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

expand=0

Если установить свойство expand в 1, то при расширении окна метка будет всегда в середине:

… 
l1.pack(expand=1)

expand=1

Свойство fill заставляет виджет заполнять все доступное пространство. Заполнить его можно во всех направлениях или только по одной из осей:

… 
l1.pack(expand=1, fill=Y)

fill=Y

Последняя опция метода pack() – anchor (якорь) – может принимать значения N (north – север), S (south – юг), W (west – запад), E (east – восток) и их комбинации:

… 
l1.pack(expand=1, anchor=SE)

Опция anchor метода pack()

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

Перепишите программу из практической работы предыдущего урока так, чтобы интерфейс выглядел примерно следующим образом:

Пример интерфейса программы

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

Комментарии

from tkinter import*
root = Tk()
root.title('Labels')
'''canvas = Canvas(root, heigh=300, width=500)
canvas.pack()'''
f_top = LabelFrame(root, height=300, width=500, text='TOP')
f_bot = LabelFrame(root, text='BOTTOM')
f_top.pack(side=TOP, padx=10, pady=10, ipadx=10, ipady=10)
f_bot.pack(side=BOTTOM, padx=10, pady=10, ipadx=10, ipady=10)
l1 = Label(f_top,
           text='1',
           bg='yellow',
           width=7,
           height=4)
l2 = Label(f_top,
           text='2',
           bg='red',
           width=7,
           height=4)
l3 = Label(f_bot,
           text='3',
           bg='blue',
           width=7,
           height=4)
l4 = Label(f_bot,
           text='4',
           bg='orange',
           width=7,
           height=4)
l1.pack(side=LEFT, expand=2, ipadx=10, ipady=10, anchor=E)
l2.pack(side=LEFT, expand=2, ipadx=10, ipady=10, anchor=W)
l3.pack(side=LEFT, expand=2, ipadx=10, ipady=10, anchor=E)
l4.pack(side=LEFT, expand=2, ipadx=10, ipady=10, anchor=W)
mainloop()

Ответ на от Programist

from tkinter import *
 
colors = {
    "КРАСНЫЙ": "#ff0000",
    "ОРАНЖЕВЫЙ": "#ff7d00",
    "ЖЕЛТЫЙ": "#ffff00",
    "ЗЕЛЕНЫЙ": "#00ff00",
    "ГОЛУБОЙ": "#007dff",
    "СИНИЙ": "#0000ff",
    "ФИОЛЕТОВЫЙ": "#7d00ff"
}
 
class But:
    def __init__(self, master, color, color_code):
        self.color = color
        self.color_code = color_code
        self.b = Button(master, width=3, bg=self.color_code, command=self.setColor)
        self.b.pack(side=LEFT, padx=1, pady=1)
 
    def setColor(self):
        l.config(text=self.color)
        e.delete(0, END)
        e.insert(0, self.color_code)
 
 
root = Tk()
 
l = Label(root)
e = Entry(root, justify='center', bd=3)
f = Frame(root)
 
l.pack()
e.pack(pady=4, padx=4)
f.pack()
 
for col in colors.keys():
    But(root, col, colors[col])
 
root.mainloop()

from tkinter import*
 
dicColor = { "#ff0000":"красный", "#ff7d00":"оранжевый", "#ffff00" : "желтый", "#00ff00" : "зеленый", "#007dff" : "голубой", "#0000ff" :"синий", "#7d00ff" : "фиолетовый"}
 
def ReadColor(colB):
    for key, value in dicColor.items():
        if eval("b{0}['bg']".format(colB)) == key:
            e.delete(0,END)
            l['text'] = value
            e.insert(0,key)
 
 
 
wid = 5
hei = 2
root = Tk()
 
frame1 = Frame(root)
frame2 = Frame(root)
 
l = Label(frame1, width = 30)
e = Entry(frame1, width = 52, justify = CENTER)
b1 = Button(frame2, width = wid,height = hei, bg = "#ff0000", command = lambda i = 1: ReadColor(i))
b2 = Button(frame2, width = wid,height = hei, bg = "#ff7d00", command = lambda i = 2: ReadColor(i))
b3 = Button(frame2, width = wid,height = hei, bg = "#ffff00", command = lambda i = 3: ReadColor(i))
b4 = Button(frame2, width = wid,height = hei, bg = "#00ff00", command = lambda i = 4: ReadColor(i))
b5 = Button(frame2, width = wid,height = hei, bg = "#007dff", command = lambda i = 5: ReadColor(i))
b6 = Button(frame2, width = wid,height = hei, bg = "#0000ff", command = lambda i = 6: ReadColor(i))
b7 = Button(frame2, width = wid,height = hei, bg = "#7d00ff", command = lambda i = 7: ReadColor(i))
 
frame1.pack(side = TOP, expand=1, fill = X)
frame2.pack(side = TOP, expand=1, fill = X)
l.pack(side = TOP, padx = 2, pady = 2, expand=1)
e.pack(side = TOP, padx = 2, pady = 2, expand=1)
b1.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b2.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b3.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b4.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b5.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b6.pack(side = LEFT, padx = 2, pady = 2, expand=1)
b7.pack(side = LEFT, padx = 2, pady = 2, expand=1)
 
 
 
root.mainloop()

Ответ на от Гость

Так через какой пакет Вы установили tkinter? через pip install "SomeProject" или как?!.

Пришлось долго помучаться но сделал
from tkinter import *
 
def red():
    Lf.config(text="красный")
    L0.delete(0, END)
    L0.insert(0, "#ff0000")
 
def orange():
    Lf.config(text="оранжевый")
    L0.delete(0, END)
    L0.insert(0, "#ff7d00")
 
def yellow():
    Lf.config(text="жёлтый")
    L0.delete(0, END)
    L0.insert(0, "#ffff00")
 
def green():
    Lf.config(text="зелёный")
    L0.delete(0, END)
    L0.insert(0, "#00ff00")
 
def cyan():
    Lf.config(text="голубой")
    L0.delete(0, END)
    L0.insert(0, "#007dff")
 
def blue():
    Lf.config(text="синий")
    L0.delete(0, END)
    L0.insert(0, "#0000ff")
 
def purple():
    Lf.config(text="фиолетовый")
    L0.delete(0, END)
    L0.insert(0, "#7d00ff")
 
root = Tk()
root.geometry("165x75")
 
Lf = Label(width=17)
Lf.pack()
 
L0 = Entry(justify=CENTER)
L0.pack()
 
b1 = Button(width=2, bg="red", command=red)
b1.pack(side=LEFT)
 
b2 = Button(width=2, bg="orange", command=orange)
b2.pack(side=LEFT)
 
b3 = Button(width=2, bg="yellow", command=yellow)
b3.pack(side=LEFT)
 
b4 = Button(width=2, bg="green", command=green)
b4.pack(side=LEFT)
 
b5 = Button(width=2, bg="cyan", command=cyan)
b5.pack(side=LEFT)
 
b6 = Button(width=2, bg="blue", command=blue)
b6.pack(side=LEFT)
 
b7 = Button(width=2, bg="purple", command=purple)
b7.pack(side=LEFT)
 
root.mainloop()

from tkinter import *
root = Tk()
 
colors = {'#ff0000':'красный', '#ff7d00':'оранжевый', '#ffff00':'желтый', '#00ff00':'зеленый', '#007dff':'голубой', '#0000ff':'синий', '#7d00ff':'фиолетовый'}
 
l1 = Label(text = '')
a1 = Entry(width = 20, bd = 5, justify = CENTER)
 
l1.pack()
a1.pack()
 
class Colors:
	def __init__(self, master, color):
		self.color = color
		self.b = Button(text = '', bg = self.color, width = 2, command = self.what_is_color)
		self.b.pack(side = LEFT, padx = 1, pady = 1, expand = 1)
 
	def what_is_color(self):
		a1.delete(0, END)
		a1.insert(0, self.color)
		l1['text'] = colors[self.color]
		return self.color
 
for i in colors:
	Colors(root, i)
 
root.mainloop()

Получилось без фреймов)
from tkinter import *
 
root = Tk()
 
l1 = Label(width=20)
e1 = Entry(width=20, justify=CENTER)
l1.pack()
e1.pack(pady=5)
 
dictColors = {
    '#ff0000': 'red',
    '#ff7d00': 'orange',
    '#ffff00': 'yellow',
    '#00ff00': 'green',
    '#007dff': 'light blue',
    '#0000ff': 'blue',
    '#7d00ff': 'purple'}
 
def setColor(color):
    l1['text'] = dictColors[color]
    e1.delete(0, END)
    e1.insert(0, color)
 
for color in dictColors:
    Button(width=3, bg=color, activebackground=color,
        command = lambda arg=color : setColor(arg)).pack(side=LEFT, ipady=4)
 
root.mainloop()

from tkinter import *
class Butt():
    def __init__ (self, master, color, color_name ):
        self.color_name = color_name
        self.color = color
        self.b = Button(master, bg = self.color, width=10, height=3, command = self.comm)
        self.b.pack(side=LEFT, padx = 2)
 
    def comm(self):
        e.delete(0, END)
        e.insert(0, self.color)
        l['text'] = self.color_name
        return self.color
 
root = Tk()
 
pp = {'красный':'#ff0000', 'оранжевый': '#ff7d00', 'желтый':'#ffff00', 'зеленый':'#00ff00', 'голубой': '#007dff','синий':'#0000ff','фиолетовый':'#7d00ff'}
l =  Label(text= '')
e = Entry(justify = 'center')
l.pack(side=TOP)
e.pack(side=TOP)
d = []
for key, value in pp.items():
    d.append(Butt(root, value, key))
 
root.mainloop()

from tkinter import *
 
root = Tk()
 
def red():
	e.delete(0, 7)
	e.insert(0, '#ff0000')
	l.config(text = "Красный")
 
def orange():
	e.delete(0, 7)
	e.insert(0, '#ff7d00')
	l.config(text = "Оранжевый")
 
def yellow():
	e.delete(0, 7)
	e.insert(0, '#ffff00')
	l.config(text = "Желтый")
 
def green():
	e.delete(0, 7)
	e.insert(0, '#00ff00')
	l.config(text = "Зелёный")
 
def cyan():
	e.delete(0, 7)
	e.insert(0, '#007dff')
	l.config(text = "Голубой")
 
def blue():
	e.delete(0, 7)
	e.insert(0, '#0000ff')
	l.config(text = "Синий")
 
def purple():
	e.delete(0,7)
	e.insert(0, '#7d00ff')
	l.config(text = "Фиолетовый")
 
 
l = Label(width = 25)
e = Entry(width = 25)
b1 = Button(bg = '#ff0000', activebackground = '#ff0000', width = 3, command = red)
b2 = Button(bg = '#ff7d00', activebackground = '#ff7d00', width = 3, command = orange)
b3 = Button(bg = '#ffff00', activebackground = '#ffff00', width = 3, command = yellow)
b4 = Button(bg = '#00ff00', activebackground = '#00ff00', width = 3, command = green)
b5 = Button(bg = '#007dff', activebackground = '#007dff', width = 3, command = cyan)
b6 = Button(bg = '#0000ff', activebackground = '#0000ff', width = 3, command = blue)
b7 = Button(bg = '#7d00ff', activebackground = '#7d00ff', width = 3, command = purple)
 
l.pack(side = TOP)
e.pack(side = TOP)
b1.pack(side = LEFT, padx = 1, pady = 5)
b2.pack(side = LEFT, padx = 1, pady = 5)
b3.pack(side = LEFT, padx = 1, pady = 5)
b4.pack(side = LEFT, padx = 1, pady = 5)
b5.pack(side = LEFT, padx = 1, pady = 5)
b6.pack(side = LEFT, padx = 1, pady = 5)
b7.pack(side = LEFT, padx = 1, pady = 5)
 
 
root.mainloop()

from tkinter import *
# список, который будет передаваться в клас для создания кнопки
b=['#ff0000 красный','#ff7d00 оранжевый','#ffff00 желтый','#00ff00 зеленый','#007dff голубой','#0000ff синий','#7d00ff фиолетовый']
 
root = Tk()
 
class buttons:
    def __init__(self, color):
        self.rgb_color=color[0:7] #так как передаем сразу и код и название цвета - разбиваем на 2 части. Это код цвета.
        self.text_color=color[7:len(color)] # Это название цвета
        self.b=Button(width=2, height=1)
        self.b['bg'] = self.rgb_color
        self.b['command']=self.print_text_color # команда при нажатии кнопки
        self.b.pack(side=LEFT,padx=1) #располагаем кнопки слева направо, с отступом по горизонтали =1
    def print_text_color(self):
        global l, e # пока не знаю как достучаться до полей созданых в теле программы. Использовал самый наглый способ - глобальные
        l['text']=self.text_color
        e.delete(0, END)
        e.insert(0,self.rgb_color)
# начало создания окна: метка и Entry
l=Label(font="Arial 10"); l.pack() 
e=Entry(font="Arial 10", justify='center'); e.pack()
# Передаем в класс создания кнопок, цвета и названия
for i in b:
    buttons(i)
 
root.mainloop()

Не разобрался как из вложенного объекта правильно обратиться к параметру внешнего объекта (Как в ColorTable.ColorButton.setColor() обратиться к self.statLabel из ColorTable)
from tkinter import *
 
colors = {'#ff0000': 'красный', '#ff7d00': 'оранжевый', '#ffff00': 'желтый', '#00ff00': 'зеленый', '#007dff': 'голубой',
          '#0000ff': 'синий', '#7d00ff': 'фиолетовый'}
 
 
class ColorTable:
    def __init__(self, master):
        self.master = master
        statLabel = Label(self.master, text="Выберете цвет", width=20, justify="center")
        statLabel.pack()
 
        pinLine = Entry(self.master, width=22, justify="center")
        pinLine.pack()
 
        class ColorButton:
            def __init__(self,master,color,colorCode):
                self.color = color
                self.colorCode = colorCode
                self.button = Button(master, width=3, text=color[:3], bg=self.colorCode, command=self.setColor)
                self.button.pack(side='left', padx=1, pady=1)
 
            def setColor(self):
                pinLine.delete(0, END)
                pinLine.insert(0, self.colorCode)
                statLabel.config(text=self.color)
 
 
        for code, name in colors.items():
            ColorButton(master,name,code)
 
 
root = Tk()
root.title("rainbow")
 
ColorTable(root)
root.resizable(0, 0)
root.mainloop()

from tkinter import *
from tkmacosx import *
tk = Tk()
tk.resizable(width=False, height=False)
tk.geometry('179x75')
def red():
    lb.config(text='red', bg='red')
    entry.delete(0, END)
    entry.insert(0, '#ff0000')
def green():
    lb.config(text='green', bg='green')
    entry.delete(0, END)
    entry.insert(0, '#008000')
 
def yellow():
    lb.config(text='yellow', bg='yellow')
    entry.delete(0, END)
    entry.insert(0, '#FFFF00')
def orange():
    lb.config(text='orange', bg='orange')
    entry.delete(0, END)
    entry.insert(0, '#FFA500')
 
def blue():
     lb.config(text='blue', bg='blue')
     entry.delete(0, END)
     entry.insert(0, '#0000FF')
def pink():
    lb.config(text='pink', bg='pink')
    entry.delete(0, END)
    entry.insert(0, '#DDA0DD')
 
 
lb = Label(width=17)
lb.pack()
entry = Entry(width=10, justify=CENTER)
entry.pack()
btn = Button(width=30, bg='red', text='', fg='black', borderless=2, command=red)
btn.pack(side=LEFT)
 
btn_2 = Button(width=30, bg='green', text='', fg='black', borderless=2, command=green)
btn_2.pack(side=LEFT)
 
btn_3 = Button(width=30, bg='yellow', text='', fg='black', borderless=2, command=yellow)
btn_3.pack(side=LEFT)
 
btn_4 = Button(width=30, bg='orange', text='', fg='black', borderless=2, command=orange)
btn_4.pack(side=LEFT)
 
btn_5 = Button(width=30, bg='blue', text='', fg='black', borderless=2, command=blue)
btn_5.pack(side=LEFT)
 
btn_6 = Button(width=30, bg='pink', text='', fg='black', borderless=2, command=pink)
btn_6.pack(side=LEFT)
 
 
 
tk.mainloop()

Размеры виджетов подгонялись под отображение на экране мобильного устройства
#импорт библиотеки tkinter
import tkinter
#создание главного окна
root = tkinter.Tk()
#создание фреймов
#
#фрейм с меткой и полем
frameUp = tkinter.Frame(root)
#фрейм с кнопками
frameDown = tkinter.Frame(root)
#создание виджетов
#
#создаем метку (на фрейме frameUp)
label = tkinter.Label(frameUp)
#создаем поле ввода, ширина 9 символов, центровка текста
entry = tkinter.Entry(frameUp, width = 9, justify = "center")
#создаем кнопку 1(красная) на фрейме frameDown
button_1 = tkinter.Button(frameDown, width = 1, bg = "#ff0000", activebackground = "#ff0000")
#создаем кнопку 2(оранж)
button_2 = tkinter.Button(frameDown, width = 1, bg = "#ff7d00", activebackground = "#ff7d00")
#создаем кнопку 3(желтая)
button_3 = tkinter.Button(frameDown, width = 1, bg = "#ffff00", activebackground = "#ffff00")
#создаем кнопку 4(зеленая)
button_4 = tkinter.Button(frameDown, width = 1, bg = "#00ff00", activebackground = "#00ff00")
#создаем кнопку 5(голубая)
button_5 = tkinter.Button(frameDown, width = 1, bg = "#007dff", activebackground = "#007dff")
#создаем кнопку 6(синия)
button_6 = tkinter.Button(frameDown, width = 1, bg = "#0000ff", activebackground = "#0000ff")
#создаем кнопку 7(фиолетовая)
button_7 = tkinter.Button(frameDown, width = 1, bg = "#7d00ff", activebackground = "#7d00ff")
#форматирование виджетов
#
#фреймы
frameUp.pack()
frameDown.pack()
#виджеты
label.pack()
entry.pack()
button_1.pack(side = "left")
button_2.pack(side = "left")
button_3.pack(side = "left")
button_4.pack(side = "left")
button_5.pack(side = "left")
button_6.pack(side = "left")
button_7.pack(side = "left")
#определение функций
#
#нажатие кнопки 1
def button1(event):
	#название цвета в метку
	label["text"] = "красный"
	#очищаем строку ввода
	entry.delete(0, 20)
	#код цвета в строку ввода
	entry.insert(0,"#ff0000")
	#центрирование текста в строке
#нажатие кнопки 2
def button2(event):
	label["text"] = "оранжевый"
	entry.delete(0, 20)
	entry.insert(0,"#ff7d00")
#нажатие кнопки 3
def button3(event):
	label["text"] = "желтый"
	entry.delete(0, 20)
	entry.insert(0,"#ffff00")
#нажатие кнопки 4
def button4(event):
	label["text"] = "зеленый"
	entry.delete(0, 20)
	entry.insert(0,"#00ff00")
#нажатие кнопки 5
def button5(event):
	label["text"] = "голубой"
	entry.delete(0, 20)
	entry.insert(0,"#007dff")
#нажатие кнопки 6
def button6(event):
	label["text"] = "синий"
	entry.delete(0, 20)
	entry.insert(0,"#0000ff")
#нажатие кнопки 7
def button7(event):
	label["text"] = "фиолетовый"
	entry.delete(0, 20)
	entry.insert(0,"#7d00ff")
#события
#
#событие при нажатии на кнопку 1
button_1.bind("<Button-1>", button1)
#событие при нажатии на кнопку 2
button_2.bind("<Button-1>", button2)
#событие при нажатии на кнопку 3
button_3.bind("<Button-1>", button3)
#событие при нажатии на кнопку 4
button_4.bind("<Button-1>", button4)
#событие при нажатии на кнопку 5
button_5.bind("<Button-1>", button5)
#событие при нажатии на кнопку 6
button_6.bind("<Button-1>", button6)
#событие при нажатии на кнопку 7
button_7.bind("<Button-1>", button7)
#ожидание событий
#
root.mainloop()

from tkinter import *
tk=Tk()
e=Entry(tk)
l=Label(tk)
tk.resizable(0,0)
def c1():
    e.delete(0,END)
    e.insert(0, "#ff0000")
    l.configure(text='красный')
def c2():
    e.delete(0,END)
    e.insert(0, "#ff7d00")
    l.configure(text='оранжевый')
def c3():
    e.delete(0,END)
    e.insert(0, "#ffff00")
    l.configure(text='желтый')
def c4():
    e.delete(0,END)
    e.insert(0, "#00ff00")
    l.configure(text='зелёный')
def c5():
    e.delete(0,END)
    e.insert(0, "#007dff")
    l.configure(text='голубой')
def c6():
    e.delete(0,END)
    e.insert(0, "#0000ff")
    l.configure(text='синий')
def c7():
    e.delete(0,END)
    e.insert(0, "#7d00ff")
    l.configure(text='фиолетовый')
tk.geometry('168x105')
b1=Button(tk,background='#ff0000',command=c1,activebackground='#ff0000',width=2)
b2=Button(tk,background='#ff7d00',command=c2,activebackground='#ff7d00',width=2)
b3=Button(tk,background='#ffff00',command=c3,activebackground='#ffff00',width=2)
b4=Button(tk,background='#00ff00',command=c4,activebackground='#00ff00',width=2)
b5=Button(tk,background='#007dff',command=c5,activebackground='#007dff',width=2)
b6=Button(tk,background='#0000ff',command=c6,activebackground='#0000ff',width=2)
b7=Button(tk,background='#7d00ff',command=c7,activebackground='#7d00ff',width=2)
c=[b1,b2,b3,b4,b5,b6,b7]
#for b in c:
 #   b.pack()
b1.place(x=0,y=79)
b2.place(x=24,y=79)
b3.place(x=48,y=79)
b4.place(x=72,y=79)
b5.place(x=96,y=79)
b6.place(x=120,y=79)
b7.place(x=144,y=79)
l.pack()
e.pack()