Виджеты (графические объекты) и их свойства. Часть 1. Урок 2

На этом уроке рассмотрим часть графических объектов (виджет), содержащихся в библиотеке Tkinter: кнопки, поля для ввода, метки, флажки, переключатели и списки. Следует понимать, что графический интерфейс пользователя достаточно стандартен, и поэтому любые подобные библиотеки-модули (в том числе и Tkinter) содержат приблизительно одинаковые виджеты.

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

Кнопки

Объект-кнопка создается вызовом класса Button модуля tkinter. При этом обязательным аргументом является лишь родительский виджет (например, окно верхнего уровня). Другие свойства могут указываться при создании кнопки или задаваться (изменяться) позже. Синтаксис:

переменная = Button (родит_виджет, [свойство=значение, … ….])

У кнопки много свойств, в примере ниже указаны лишь некоторые из них.

from tkinter import *
 
root = Tk()
 
but = Button(root,
          text="Это кнопка", #надпись на кнопке
          width=30,height=5, #ширина и высота
          bg="white",fg="blue") #цвет фона и надписи
 
but.pack()
root.mainloop()

bg и fg – это сокращения от background (фон) и foreground (передний план). Ширина и высота измеряются в знакоместах (количество символов).

Метки

Метки (или надписи) — это достаточно простые виджеты, содержащие строку (или несколько строк) текста и служащие в основном для информирования пользователя.

lab = Label(root, text="Это метка! \n Из двух строк.", font="Arial 18")

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

Такое поле создается вызовом класса Entry модуля tkinter. В него пользователь может ввести только одну строку текста.

ent = Entry(root,width=20,bd=3)

bd – это сокращение от borderwidth (ширина границы).

Многострочное текстовое поле

Text предназначен для предоставления пользователю возможности ввода не одной строки текста, а существенно больше.

tex = Text(root,width=40,
          font="Verdana 12",
          wrap=WORD) 

Последнее свойство (wrap) в зависимости от своего значения позволяет переносить текст, вводимый пользователем либо по символам, либо по словам, либо вообще не переносить, пока пользователь не нажмет Enter.

Радиокнопки (переключатели)

Объект-радиокнопка никогда не используется по одному. Их используют группами, при этом в одной группе может быть «включена» лишь одна кнопка.

var=IntVar()
var.set(1)
rad0 = Radiobutton(root,text="Первая",
          variable=var,value=0)
rad1 = Radiobutton(root,text="Вторая",
          variable=var,value=1)
rad2 = Radiobutton(root,text="Третья",
          variable=var,value=2) 

Одна группа определяет значение одной переменной, т. е. если в примере будет выбрана радиокнопка rad2, то значение переменной будет var будет 2. Изначально также требуется установить значение переменной (выражение var.set(1) задает значение переменной var равное 1).

Флажки

Объект checkbutton предназначен для выбора не взаимоисключающих пунктов в окне (в группе можно активировать один, два или более флажков или не один). В отличие от радиокнопок, значение каждого флажка привязывается к своей переменной, значение которой определяется опциями onvalue (включено) и offvalue (выключено) в описании флажка.

c1 = IntVar()
c2 = IntVar()
che1 = Checkbutton(root,text="Первый флажок",
          variable=c1,onvalue=1,offvalue=0)
che2 = Checkbutton(root,text="Второй флажок",
          variable=c2,onvalue=2,offvalue=0) 

Списки

Вызов класса Listbox создает объект, в котором пользователь может выбрать один или несколько пунктов в зависимости от значения опции selectmode. В примере ниже значение SINGLE позволяет выбирать лишь один пункт из списка.

r = ['Linux','Python','Tk','Tkinter']
lis = Listbox(root,selectmode=SINGLE,height=4)
for i in r:
     lis.insert(END,i) 

Изначально список (Listbox) пуст. С помощью цикла for в него добавляются пункты из списка (тип данных) r. Добавление происходит с помощью специального метода класса Listbox — insert. Данный метод принимает два параметра: куда добавить и что добавить.

Большинство методов различных виджет мы рассмотрим по ходу изучения данного курса.

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

Создайте два скрипта на языке программирования Python и с использованием модуля Tkinter генерирующие шаблоны представленные ниже.

Создание графического интерфейса: текстовые поля и кнопка
Создание графического интерфейса: радиокнопки и флажки

Сделал всё по объектному,

Сделал всё по объектному, интересно, такой вот пример проектирования каноничен?

from tkinter import *
 
class Form:
    def __init__(self):
        self.root = Tk()
        self.root.title('Форма для ответа')
        self.root.geometry('500x400+300+200')
        self.width = 50
 
class Question:
    def __init__(self, form, question):
        self.lab = Label(form.root, text=question)
        self.ent = Entry(form.root, width=form.width+16)
        self.lab.pack()
        self.ent.pack()
 
class BigQuestion:
    def __init__(self, form, question):
        self.lab = Label(form.root, text=question)
        self.txt = Text(form.root, width=form.width, height=4)
        self.lab.pack()
        self.txt.pack()
 
class RadioBut:
    def __init__(self, form, question):
        self.lab = Label(form.root, text=question)
        self.lab.pack()
        self.var = IntVar()
        self.var.set(1)
        self.rad0 = Radiobutton(form.root, text="0-9", variable=self.var,value=9)
        self.rad1 = Radiobutton(form.root, text='10-19', variable=self.var, value=19)
        self.rad2 = Radiobutton(form.root, text='20-29', variable=self.var, value=29)
        self.rad3 = Radiobutton(form.root, text='30-39', variable=self.var, value=39)
        self.rad0.pack()
        self.rad1.pack()
        self.rad2.pack()
        self.rad3.pack()
 
class Flags:
    def __init__(self, form, question):
        self.lab = Label(form.root, text=question)
        self.lab.pack()
        self.c0 = IntVar()
        self.c1 = IntVar()
        self.c2 = IntVar()
        self.c3 = IntVar()
        self.che0 = Checkbutton(form.root, text="Красный",bg='red',
                                variable=self.c0, onvalue=1, offvalue=0)
        self.che1 = Checkbutton(form.root, text="Синий", bg='blue',
                                variable=self.c1, onvalue=1, offvalue=0)
        self.che2 = Checkbutton(form.root, text="Зелёный", bg='green',
                                variable=self.c2, onvalue=1, offvalue=0)
        self.che3 = Checkbutton(form.root, text="Жёлтый",bg='yellow',
                                variable=self.c3, onvalue=1, offvalue=0)
        self.che0.pack()
        self.che1.pack()
        self.che2.pack()
        self.che3.pack()
 
class Scene:
    def __init__(self):
        self.form = Form()
        self.qstn = Question(self.form, 'Ваш адрес:')
        self.comm = BigQuestion(self.form, 'Комментарий:')
        self.radi = RadioBut(self.form, 'Сколько штук?')
        self.flag = Flags(self.form, 'Какого цвета?')
        self.butt = Button(self.form.root, text='Отправить')
        self.butt.pack()
        self.butt.bind('<Button-1>', self.go)
        self.form.root.mainloop()
 
    def go(self, event):
        print('Send:\n',
              'Colors:', self.flag.c0.get(), self.flag.c1.get(),
              self.flag.c2.get(), self.flag.c3.get(),
              'Count:', self.radi.var.get())
 
scene = Scene()

# 2 from tkinter import

# 2
from tkinter import *
 
class Create_Label:
     def __init__(self,text,f):
          self.lab = Label(root)
          self.lab["text"] = text
          self.lab["bg"] = f
          self.lab["font"] = "Arial 16"
          self.lab.pack()
class Cr_RadoiB:
     def __init__(self,text,var,v):
          self.rad = Radiobutton(root)
          self.rad["text"] = text
          self.rad["variable"] = var
          self.rad["value"] = v
          self.rad.pack()
class Check_b:
     def __init__(self,text,var,v):
          self.chek = Checkbutton(root)
          self.chek["text"] = text
          self.chek["variable"] = var
          self.chek["onvalue"] = v
          self.chek["offvalue"] = 0
          self.chek["bg"] = text
          self.chek.pack()
 
 
root = Tk()
var=IntVar()
var.set(1)
 
lab =  Create_Label("Сколько штук ?",None)
rad1 = Cr_RadoiB("0-10",var,0)
rad1 = Cr_RadoiB("10-20",var,1)
rad1 = Cr_RadoiB("20-30",var,2)
rad1 = Cr_RadoiB("30-40",var,3)
 
lab =  Create_Label("Кокой цвет ?",None)
c1 = IntVar()
c2 = IntVar()
c3 = IntVar()
c4 = IntVar()
chak1 = Check_b("red",c1,1)
chak1 = Check_b("blue",c2,2)
chak1 = Check_b("green",c3,3)
chak1 = Check_b("yellow",c4,4)

две программы поотдельности

две программы поотдельности работают,но при соединении,вообще ничего не выводит,посмотрите, пожалуйста:

# -*- coding: utf-8 -*-
from Tkinter import *
def lub (event):
    from Tkinter import *
    form =Tk()
    ladel=Label (form, text="Сколько штук:", font="Calibri 14")
    var=IntVar()
    var.set(1)
    che1=Radiobutton (form,text="0-10",
                          variable=var, value=1)
    che2=Radiobutton (form,text="11-20",
                          variable=var,  value=2)
    che3=Radiobutton (form,text="21-30",
                          variable=var,  value=3)
    che4=Radiobutton (form,text="31-40",
                         variable=var,  value=4)
    label=Label (form, text="Какого цвета?", font="Calibri 14")
    r1=IntVar()
    r2=IntVar()
    r3=IntVar()
    r4=IntVar()
    rad1=Checkbutton(form,text="Красный",
                         variable=r1, onvalue=1, offvalue=0,
                         bg="red",fg="black")
    rad2=Checkbutton(form,text="Зеленый",
                         variable=r2, onvalue=1, offvalue=0,
                         bg="green",fg="black")
    rad3=Checkbutton(form,text="Желтый",
                         variable=r3, onvalue=1, offvalue=0,
                         bg="yellow",fg="black")
    rad4=Checkbutton(form,text="Оранжевый",
                         variable=r4, onvalue=1, offvalue=0,
                         bg="orange",fg="black")
    ladel.pack()
    che1.pack()
    che2.pack()
    che3.pack()
    che4.pack()
    label.pack()
    rad1.pack()
    rad2.pack()
    rad3.pack()
    rad4.pack()
    form.mainloop ()
root=Tk()
lab1=Label (root, text="Ваш адрес:", font= "Calibri 14")
ent=Entry (root, width=20, bd=3)
lab2=Label (root, text="Комментарии", font= "Calibri 14")
tex=Text (root, width= 40,
          font= "Calibri 14",
          wrap=WORD)
but=Button( root,
            text="Отправить",
            width=15, height=2,
            bg='pink', fg='black')
lab1.pack()
ent.pack()
lab2.pack()
tex.pack()
but.pack()
but.bind ("<Button-1>, lub")
root.mainloop()

вот как можно объединить две

вот как можно объединить две программы

from tkinter import *
 
root=Tk()
 
stroka=Label(root,
             text='Ваш адрес')
 
pole=Entry(root)
 
stroka1=Label(root,
              text='Коментарии')
 
Mpole=Text(root)
 
dut=Button(root,
           text='Отправить')
 
stroka.pack()
pole.pack()
stroka1.pack()
Mpole.pack()
dut.pack()
 
root.mainloop()
 
root1=Tk()
 
tex=Label(root1,
          text='Сколько штук')
tex.pack()
 
var=IntVar()
var.set(1)
 
r=Radiobutton(root1,
              text='0-10',
              variable=var,
              value=0)
r1=Radiobutton(root1,
               text='11-20',
               variable=var,
               value=1)
r2=Radiobutton(root1,
               text='21-30',
               variable=var,
               value=2)
r3=Radiobutton(root1,
               text='31-40',
               variable=var,
               value=3)
r.pack()
r1.pack()
r2.pack()
r3.pack()
 
tex2=Label(root1,
           text='Какого цвета')
tex2.pack()
 
s=IntVar()
s1=IntVar()
s2=IntVar()
s3=IntVar()
 
flag=Checkbutton(root1,
                 text='Красный',
                 variable=s,
                 onvalue=1,
                 offvalue=0,
                 bg='red')
flag1=Checkbutton(root1,
                  text='Синий',
                  variable=s1,
                  onvalue=1,
                  offvalue=0,
                  bg='blue')
flag2=Checkbutton(root1,
                  text='Зелёный',
                  variable=s2,
                  onvalue=1,
                  offvalue=0,
                  bg='green')
flag3=Checkbutton(root1,
                 text='Жёлтый',
                 variable=s3,
                 onvalue=1,
                 offvalue=0,
                 bg='yellow')
 
flag.pack()
flag1.pack()
flag2.pack()
flag3.pack()
 
roo1.mainloop()

ели объединить две программы то они будут запускаться по очереди "если 1 окно закрыть появится 2"

А как сделать так, чтобы они

А как сделать так, чтобы они отображались в одном окне одновременно? Чтоб как на задании

Должно быть два отдельных

Должно быть два отдельных файла!

Первая программа (вариант для Python v.3):

from tkinter import *
 
root = Tk()
 
but = Button(root,
              text="Отправить",   
              width=15,height=1,
              font="Verdana 12",
              bg="lightblue") 
 
lab = Label(root,text="Ваш адрес:",
            font="Arial 12",
            bg="lightyellow")
ent = Entry(root,width=20,bd=3,bg="lightyellow")
 
lab2 = Label(root,text="Комментарий:",
             font="Arial 12")
tex = Text(root,width=20,height=5,
           font="Verdana 12",
           wrap=NONE)
 
lab.pack()
ent.pack()
lab2.pack()
tex.pack()
but.pack()
 
root.mainloop()

Вторая программа (Python v.3):

from tkinter import *
 
root = Tk()
 
lab1 = Label(root,text="Сколько штук?")
var=IntVar()
var.set(0)
rad0 = Radiobutton(root,text="0-10",
                   variable=var,value=0)
rad1 = Radiobutton(root,text="11-20",
                   variable=var,value=1)
rad2 = Radiobutton(root,text="21-30",
                   variable=var,value=2)
rad3 = Radiobutton(root,text="31-40",
                   variable=var,value=3)
 
lab2 = Label(root,text="Какого цвета?")
c1 = IntVar()
c2 = IntVar()
c3 = IntVar()
c4 = IntVar()
che1 = Checkbutton(root,text="RED",bg="red",
                   variable=c1,onvalue=1,offvalue=0)
che2 = Checkbutton(root,text="BLUE",bg="blue",
                   variable=c2,onvalue=2,offvalue=0)
che3 = Checkbutton(root,text="GREEN",bg="green",
                   variable=c3,onvalue=3,offvalue=0)
che4 = Checkbutton(root,text="YELLOW",bg="yellow",
                   variable=c4,onvalue=4,offvalue=0)
 
lab1.pack()
rad0.pack()
rad1.pack()
rad2.pack()
rad3.pack()
lab2.pack()
che1.pack()
che2.pack()
che3.pack()
che4.pack()
 
root.mainloop()

как сделать чтобы первая

как сделать чтобы первая выводила текст в Python shell ?

смотри предыдущий урок

смотри предыдущий урок

Напишате,пожалуйста,

Напишате,пожалуйста, решение, моё почему-то кроме кнопки ничего не выводит...

Не забывайте использовать

Не забывайте использовать методы pack для всех созданных элементов. Например,
lab1.pack()
ent1.pack()
lab2.pack()
tex1.pack()
but1.pack()