Виджеты Button, Label, Entry

В этом уроке рассмотрим подробнее три наиболее простых и популярных виджета GUI – кнопку, метку и однострочное текстовое поле. В tkinter объекты этих элементов интерфейса порождаются соответственно от классов Button, Label и Entry.

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

В Tkinter существует три способа конфигурирования свойств виджетов: в момент создания объекта, с помощью метода config(), он же configure(), путем обращения к свойству как к элементу словаря.

Button – кнопка

Самыми важными свойствами виджета класса Button являются text, с помощью которого устанавливается надпись на кнопке, и command для установки действия, то есть того, что будет происходить при нажатии на кнопку. По умолчанию размер кнопки соответствует ширине и высоте текста, однако с помощью свойств width и height эти параметры можно изменить. Единицами измерения в данном случае являются знакоместа. Такие свойства как bg, fg, activebackground и activeforeground определяют соответственно цвет фона и текста, цвет фона и текста во время нажатия (и установки курсора мыши над кнопкой).

from tkinter import *
 
root = Tk()
b1 = Button(text="Изменить", width=15, height=3)
 
def change():
    b1['text'] = "Изменено"
    b1['bg'] = '#000000'
    b1['activebackground'] = '#555555'
    b1['fg'] = '#ffffff'
    b1['activeforeground'] = '#ffffff'
 
b1.config(command=change)
 
b1.pack()
root.mainloop()

Здесь свойство command устанавливается с помощью метода config(). Однако можно было сделать и так: b1['command'] = change. Вот так будет выглядеть кнопка после запуска программы и после нажатия на нее:

Пример изменения свойств виджета-кнопки

Label – метка

Виджет Label просто отображает текст в окне и служит в основном для информационных целей (вывод сообщений, подпись других элементов интерфейса). Свойства метки во многом схожи с таковыми у кнопки. Однако у меток нет опции command. Клик по метке не обрабатывается Tkinter. На примере объекта типа Label рассмотрим свойство font – шрифт.

from tkinter import *
root = Tk()
l1 = Label(text="Машинное обучение", font="Arial 32")
l2 = Label(text="Распознавание образов", font=("Comic Sans MS", 24, "bold"))
l1.config(bd=20, bg='#ffaaaa')
l2.config(bd=20, bg='#aaffff')
l1.pack()
l2.pack()
root.mainloop()

Значение шрифта можно передать как строку или как кортеж. Второй вариант удобен, если имя шрифта состоит из двух и более слов. После названия шрифта можно указать размер и стиль.

Также как font свойство bd есть не только у метки. С его помощью регулируется размер границ (единица измерения – пиксель):

Конфигурирование свойств Label

Бывает, что метки и кнопки не присваивают переменным, если потом к ним в коде не приходится обращаться. Их создают от класса и сразу размещают:

from tkinter import *
 
def take():
    l['text'] = "Выдано"
 
root = Tk()
Label(text="Пункт выдачи").pack()
Button(text="Взять", command=take).pack()
l = Label(width=10, height=1)
l.pack()
root.mainloop()

В данном примере только у одной метки есть связь с переменной, так как одно из ее свойств может быть изменено в процессе выполнения программы.

Entry – однострочное текстовое поле

Текстовые поля предназначены для ввода информации пользователем. Однако нередко также для вывода, если предполагается, что текст из них будет скопирован. Текстовые поля как элементы графического интерфейса бывают однострочными и многострочными. В tkinter вторым соответствует класс Text, который будет рассмотрен позже.

Свойства экземпляров Entry во многом схожи с двумя предыдущими виджетами. А вот методы – нет. Из текстового поля можно взять текст. За это действие отвечает метод get(). В текстовое поле можно вставить текст методом insert(). Также можно удалить текст методом delete().

Метод insert() принимает позицию, в которую надо вставлять текст, и сам текст.

Такой код

from tkinter import *
root = Tk()
e1 = Entry(width=50)
def insert():
    e1.insert(0,"Tkinter - GUI ")
b = Button(text="Вставить", command=insert)
e1.pack()
b.pack()
root.mainloop()

приведет к тому, что после каждого нажатия на кнопку будет вставляться новая фраза "Tkinter - GUI " перед уже существующей в поле строкой.

Метод insert() объекта Entry

Если 0 в insert() заменить на константу END, то вставляться будет в конец. Можно указать любое число-индекс знакоместа, тогда вставка будет производиться куда-либо в середину строки.

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

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

Напишите программу, состоящую из семи кнопок, цвета которых соответствуют цветам радуги. При нажатии на ту или иную кнопку в текстовое поле должен вставляться код цвета, а в метку – название цвета.

Коды цветов в шестнадцатеричной кодировке: #ff0000 – красный, #ff7d00 – оранжевый, #ffff00 – желтый, #00ff00 – зеленый, #007dff – голубой, #0000ff – синий, #7d00ff – фиолетовый.

Примерно должно получиться так:

Пример программы с текстовым полем и кнопками

Для выравнивания строки по центру в текстовом поле используется свойство justify со значением CENTER.

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

Комментарии

Ответ на от p3_181027_2114.py

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

from tkinter import*
root = Tk()
root.title('#16')
f_1 = Frame(root)
f_2 = Frame(root)
f_3 = Frame(root)
f_4 = Frame(root)
f_1.pack(side=TOP)
f_2.pack(side=BOTTOM)
f_3.pack(side=BOTTOM)
f_4.pack(side=BOTTOM)
e_1 = Entry(f_1)
Label(f_1, text='Цвет в #16 кодировке', font=('Arial', 12)).pack(side=LEFT)
e_1.pack(side=LEFT)
colors = ['#ff0000',
          '#ff7d00',
          '#ffff00',
          '#00ff00',
          '#007dff',
          '#0000ff',
          '#7d00ff'
          ]
buttons = []
class _Button:
    def __init__(self, bg):
        self.bg = bg
        self.create_button()
 
    def create_button(self):
        if len(buttons) < 3:
            b = Button(f_4,
                       bg=self.bg,
                       width=10,
                       height=4,
                       command=self.response)
            b.pack(side=LEFT)
            buttons.append(b)
        elif len(buttons) > 3:
            b = Button(f_3,
                       bg=self.bg,
                       width=10,
                       height=4,
                       command=self.response)
            b.pack(side=LEFT)
            buttons.append(b)
        else:
            b = Button(f_2,
                       bg=self.bg,
                       width=10,
                       height=4,
                       command=self.response)
            b.pack(side=LEFT)
            buttons.append(b)
 
 
 
    def response(self):
        e_1.delete(0, END)
        e_1.insert(0, str(self.bg))
 
 
 
 
for color in colors:
    b = _Button(bg=color)
    #buttons.append([b, color])
mainloop()

Спасибо, с удовольствием скоротал вечер!
from tkinter import *
 
colors = ['#ff0000', '#ff7d00', '#ffff00', '#00ff00', '#007dff', '#0000ff', '#7d00ff']
 
root = Tk()
 
class But:
	def __init__(self, master, color):
		self.color = color
		self.b = Button(master, width=20, bg=self.color, command=self.what_color)
		self.b.pack()
	def what_color(self):
		e.delete(0, END)
		e.insert(0, self.color)
		return self.color
 
e = Entry(width=20, justify='center')
e.pack()
 
for c in colors:
	But(root, c)
 
root.mainloop()

Ответ на от r_476

Не перестаю восхищаться изящности вашего решения. Добавила только 4 строки для отражения цвета в Label.
from tkinter import *
 
colors = ['#ff0000', '#ff7d00', '#ffff00', '#00ff00', '#007dff', '#0000ff', '#7d00ff']
colors_2={'#ff0000':"красный", '#ff7d00':"оранжевый", '#ffff00':"желтый", '#00ff00':"зелёный", '#007dff':"голубой", '#0000ff':"синий", '#7d00ff':"фиолетовый"}
root = Tk()
 
class But:
	def __init__(self, master, color):
		self.color = color
		self.b = Button(master, width=20, bg=self.color, command=self.what_color)
		self.b.pack()
	def what_color(self):
		e.delete(0, END)
		e.insert(0, self.color)
		l['text']=colors_2[self.color]
		return self.color
 
l=Label(text="")
l.pack()
e = Entry(width=25, justify='center')
e.pack()
 
for c in colors:
	But(root, c)
 
root.mainloop()

Ответ на от AnnaKo

Круто!!! У меня так получилось
#!/usr/bin/python3
 
from tkinter import *
 
class Color:
 
    color = {
        '#ff0000' : 'красный',
        '#ff7d00' : 'оранжевый',
        '#ffff00' : 'желтый',
        '#00ff00' : 'зеленый',
        '#007dff' : 'голубой',
        '#0000ff' : 'синий',
        '#7d00ff' : 'фиолетовый',
    }
 
    def __init__(self, master):
        self.label = Label(master, text='text', anchor='c')
        self.label.pack()
 
        self.entry = Entry(master, justify=CENTER)
        self.entry.pack()
 
        for key, value in self.color.items():
            exec('Button(master, width=18, command=self.key{2}value, bg="{0}", text="{1}").pack()'.format(key,value,key[1:]))
 
    for key, value in color.items():
        def bindedfunc(self, v=value, k=key):
            self.label["text"] = v
            self.entry.delete(0, END)
            self.entry.insert(0, "{}".format(k))
 
        exec('key{}value = bindedfunc'.format(key[1:]))
 
root = Tk()
# root.geometry("400x200")
root.title("Радуга цвета")
app = Color(root)
 
root.mainloop()

Ответ на от AnnaKo

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=17, bg=self.color_code, command=self.setColor)
        self.b.pack()
 
    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=5)
 
l.pack()
e.pack()
 
for col in colors.keys():
    But(root, col, colors[col])
 
root.mainloop()

Ответ на от AnnaKo

Не пойму для чего тут e.delete(0, END) e.insert(0, self.color) это же вроде для Еntry.. label при нажатии и так меняется
from tkinter import *
 
class But:
    def __init__(self, master, colour, command):
        self.b = Button(bg = colour, command = self.sign, width = 20)
        self.b.pack()
        self.c = command
    def sign(self):
        l['text'] = self.c
 
hexcode = ['#ff0000', '#ff7d00', '#ffff00', '#00ff00', '#007dff', '#0000ff', '#7d00ff']
colour = ['red', 'orange', 'yellow', 'green', 'blue', 'dark blue', 'purple']
root = Tk()
l=Label()
l.pack()
 
for i in range(len(hexcode)):
    i = But(root, hexcode[i], colour[i])
 
root.mainloop()

from tkinter import *
 
class butt:
    masColor = ('red', 'orange', 'yellow', 'green', 'blue', 'white', 'black')
    def __init__(self,master):
        e = Entry(width = 15, justify=CENTER)
        e.pack()
        for i in range(len(self.masColor)):
            Button(bg = self.masColor[i],width = 15,height = 3, command=lambda event=e,f=self.masColor[i] : self.changeColor(event,f)).pack()
 
    def changeColor(self,buten,color):
        buten.delete(0,END)
        buten.insert(0,color)
 
root = Tk()
root.title("Проба цвета")
butt(root)
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 = 30
root = Tk()
 
l = Label(root, width = wid)
e = Entry(root, width = wid)
b1 = Button(root, width = wid, bg = "#ff0000", command = lambda i = 1: ReadColor(i))
b2 = Button(root, width = wid, bg = "#ff7d00", command = lambda i = 2: ReadColor(i))
b3 = Button(root, width = wid, bg = "#ffff00", command = lambda i = 3: ReadColor(i))
b4 = Button(root, width = wid, bg = "#00ff00", command = lambda i = 4: ReadColor(i))
b5 = Button(root, width = wid, bg = "#007dff", command = lambda i = 5: ReadColor(i))
b6 = Button(root, width = wid, bg = "#0000ff", command = lambda i = 6: ReadColor(i))
b7 = Button(root, width = wid, bg = "#7d00ff", command = lambda i = 7: ReadColor(i))
 
l.pack()
e.pack()
b1.pack()
b2.pack()
b3.pack()
b4.pack()
b5.pack()
b6.pack()
b7.pack()
 
 
 
root.mainloop()

from tkinter import *
 
codes = ["#ff0000","#ff7d00","#ffff00","#00ff00","#007dff","#0000ff","#7d00ff"]
clrs = ["красный","оранжевый","желтый","зеленый","голубой","синий","фиолетовый"]
btns = ["red","orange","yellow","green","cyan","blue","purple"]
 
def func(r):
    header.config(text=clrs[r])
    code.set(codes[r])
 
root = Tk()
root.geometry("120x220+700+300")
 
header = Label(text="")
header.grid(row=0, column=0, sticky=EW)
 
code = StringVar()
code_entry = Entry(textvariable=code,justify = CENTER)
code_entry.grid(row=1, column=0, sticky=EW)
 
 
for r in range(7):
        btns[r] = Button(bg = codes[r],
                     command = lambda r=r: func(r))
        btns[r].grid(row=r+2, sticky=EW)
 
root.mainloop()

from tkinter import *
 
 
colors = ['#ff0000', '#ff7d00', '#ffff00', '#00ff00', '#007dff', '#0000ff', '#7d00ff']
 
dictColors = {
    "#ff0000":"Red",
    "#ff7d00":"Orange",
    "#ffff00":"Yellow",
    "#00ff00":"Green",
    "#007dff":"Blue",
    "#0000ff":"Dark Blue",
    "#7d00ff":"Purple"
}
 
def change(index):
    numColor.delete(0, END)
    numColor.insert(0, colors[index])
    nameColor['text'] = dictColors[colors[index]]
 
root = Tk()
root.geometry("100x270")
root.title("Test")
 
nameColor = Label(text="Click")
nameColor.pack()
 
numColor = Entry(justify=CENTER)
numColor.insert(0, "I don't know")
numColor.pack()
 
buttons = list()
for i in range(len(colors)):
    buttons.append(Button(bg=colors[i], command=lambda index = i: change(index), width=10, height=1))
    buttons[i].pack()
 
root.mainloop()

Для тех, у кого на Mac кнопки не красятся, можно использовать highlightbackground
root = Tk()
 
color = Label(root)
code = Entry(root)
 
 
def set_purple():
    color['text'] = 'Фиолетовый'
    code.delete(0, END)
    code.insert(0, '#7d00ff')
 
 
def set_red():
    color['text'] = 'Красный'
    code.delete(0, END)
    code.insert(0, '#ff0000')
 
 
def set_green():
    color['text'] = 'Зеленый'
    code.delete(0, END)
    code.insert(0, '#00ff00')
 
 
def set_blue():
    color['text'] = 'Голубой'
    code.delete(0, END)
    code.insert(0, '#007dff')
 
 
def set_dark_blue():
    color['text'] = 'Синий'
    code.delete(0, END)
    code.insert(0, '#0000ff')
 
 
def set_orange():
    color['text'] = 'Оранжевый'
    code.delete(0, END)
    code.insert(0, '#ff7d00')
 
 
def set_yellow():
    color['text'] = 'Желтый'
    code.delete(0, END)
    code.insert(0, '#ffff00')
 
 
purple = Button(root, highlightbackground='#7d00ff', width=20, height=2, command=set_purple).pack(side=BOTTOM)
dark_blue = Button(root, highlightbackground='#0000ff', width=20, height=2, command=set_dark_blue).pack(side=BOTTOM)
blue = Button(root, highlightbackground='#007dff', width=20, height=2, command=set_blue).pack(side=BOTTOM)
green = Button(root, highlightbackground='#00ff00', width=20, height=2, command=set_green).pack(side=BOTTOM)
yellow = Button(root, highlightbackground='#ffff00', width=20, height=2, command=set_yellow).pack(side=BOTTOM)
orange = Button(root, highlightbackground='#ff7d00', width=20, height=2, command=set_orange).pack(side=BOTTOM)
red = Button(root, highlightbackground='#ff0000', width=20, height=2, command=set_red).pack(side=BOTTOM)
 
 
color.pack()
 
code.config(justify=CENTER)
code.pack()
 
root.resizable(False, False)
 
root.mainloop()