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

На этом уроке продолжим рассматривать графические объекты (виджеты), содержащихся в библиотеке Tkinter. Это будут рамка (frame), шкала (scale), полоса прокрутки (scrollbar), окно верхнего уровня (toplevel).

Frame (рамка)

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

from tkinter import *
 
root = Tk()
 
fra1 = Frame(root,width=500,height=100,bg="darkred")
fra2 = Frame(root,width=300,height=200,bg="green",bd=20)
fra3 = Frame(root,width=500,height=150,bg="darkblue")
 
fra1.pack()
fra2.pack()
fra3.pack()
 
root.mainloop() 

Данный скрипт создает три фрейма разного размера. Свойство bd (сокращение от boderwidth) определяет расстояния от края рамки до заключенных в нее виджетов (если они есть).

На фреймах также можно размещать виджеты как на основном окне (root). Здесь текстовое поле находится на рамке fra2.

ent1 = Entry(fra2,width=20)
ent1.pack() 

Scale (шкала)

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

sca1 = Scale(fra3,orient=HORIZONTAL,length=300,
          from_=0,to=100,tickinterval=10,resolution=5)
sca2 = Scale(root,orient=VERTICAL,length=400,
          from_=1,to=2,tickinterval=0.1,resolution=0.1) 

Свойства:

  • orient определяет направление шкалы;
  • length – длина шкалы в пикселях;
  • from_ и to – с какого значения шкала начинается и каким заканчивается (т. е. диапазон значений);
  • tickinterval – интервал, через который отображаются метки для шкалы;
  • resolution - минимальная длина отрезка, на которую пользователь может передвинуть движок.

Scrollbar (полоса прокрутки)

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

from tkinter import *
 
root = Tk()
 
tx = Text(root,width=40,height=3,font='14')
scr = Scrollbar(root,command=tx.yview)
tx.configure(yscrollcommand=scr.set)
 
tx.grid(row=0,column=0)
scr.grid(row=0,column=1)
root.mainloop() 

В примере сначала создается текстовое поле (tx), затем полоса прокрутки (scr), которая привязывается с помощью опции command к полю tx по вертикальной оси (yview). Далее поле tx изменяется (конфигурируется) с помощью метода configure: устанавливается значение опции yscrollcommand.

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

Toplevel (окно верхнего уровня)

С помощью класс Toplevel создаются дочерние окна, на которых также могут располагаться виджеты. Следует отметить, что при закрытии главного окна (или родительского), окно Toplevel также закрывается. С другой стороны, закрытие дочернего окна не приводит к закрытию главного.

win = Toplevel(root,relief=SUNKEN,bd=10,bg="lightblue")
win.title("Дочернее окно")
win.minsize(width=400,height=200) 

Метод title определяет заголовок окна. Метод minsize конфигурирует минимальный размер окна (есть метод maxsize, определяющий максимальный размер окна). Если значение аргументов minsize будет таким же как у maxsize, то пользователь не сможет менять размеры окна.

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

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

Создание графического интерфейса: рамки (frame) и шкала (scale)
Создание графического интерфейса: текстовое поле с полосой прокрутки

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

Задание 1: Первый

Задание 1:

Первый скрипт:

from tkinter import *
 
root = Tk()
root.title("Практика 2, часть 1.1")
root.minsize(width=300, height=150)
 
fr = Frame(root, width=150, height=100, bg="lightgreen", bd=15)
sc = Scale(fr,orient=HORIZONTAL, length=300,
           from_=0, to=100, tickinterval=10,resolution=5)
fr2 = Frame(root, width=400, height=100, bg="green", bd=25)
ent = Entry(fr2, width=10)
 
fr.pack()
sc.pack()
fr2.pack()
ent.pack()
 
root.mainloop()

Второй скрипт:

from tkinter import *
 
root = Tk()
root.title("Практика 2, часть 1.2")
 
tx = Text(root,width=40,height=3,font='Verdana 12')
scr = Scrollbar(root,command=tx.yview)
tx.configure(yscrollcommand=scr.set)
 
tx.grid(row=0,column=0)
scr.grid(row=0,column=1)
 
root.mainloop()

Задание 2:

Скрипт (надеюсь, я правильно понял задание):

root = Tk()
root.title("Практика 2, часть 2")
root.minsize(width=250, height=130)
root.maxsize(width=250, height=130)
 
fr=Frame(root, width=250, height=100, bg="Black", bd=52)
tx = Label(fr,
           text="Главное окно",
           font="Verdana 15",
           fg="red", bg="black")
 
fr.pack()
tx.pack()
 
win_one = Toplevel(root)
win_one.title("Дочернее окно 1")
win_one.minsize(width=280, height=130)
win_one.maxsize(width=280, height=130)
 
fr2 = Frame(win_one, width=250, height=100, bg="Red", bd=52)
tx2 = Label(fr2,
           text="Дочернее окно 1",
           font="Verdana 15",
           fg="black", bg="red")
 
fr2.pack()
tx2.pack()
 
win_two = Toplevel(root)
win_two.title("Дочернее окно 2")
win_two.minsize(width=280, height=130)
win_two.maxsize(width=280, height=130)
 
fr3 = Frame(win_two, width=250, height=100, bg="Blue", bd=52)
tx3 = Label(fr3,
           text="Дочернее окно 2",
           font="Verdana 15",
           fg="black", bg="blue")
 
fr3.pack()
tx3.pack()
 
root.mainloop()

А как заменить не имя окна а

А как заменить не имя окна а именно значок и как заменять текстуры кнопок подскажите пж

Не понятно почему не

Не понятно почему не двигается слайдер по горизонтали. Вроде Х сделан аналогично У ... =(

from tkinter import *
 
root = Tk()
root.title( "My forms =)" )
root.minsize(width=400,height=300)
root.maxsize(width=1000,height=900)
 
scry = Scrollbar( root, orient=VERTICAL )
scry.pack( side = RIGHT, fill=Y )
scrx = Scrollbar( root, orient=HORIZONTAL )
scrx.pack( side = BOTTOM, fill=X )
 
txt1 = Text( root, font="Arial 12", wrap=None, yscrollcommand=scry.set, xscrollcommand=scrx.set)
txt1.pack( side = LEFT, fill = BOTH, expand = True )
 
scry.config( command = txt1.yview )
scrx.config( command = txt1.xview )
 
root.mainloop()

цикл

При добавлении в код виджета 'Scrollbar' программа зависает. Вот код:

from tkinter import*
 
root = Tk()
 
fra1 = Frame(root,width=500,height=100,bg="green",bd=10)
scl1 = Scale(fra1,orien=HORIZONTAL,length=400,from_=0,to=100,tickinterval=10,resolution=5)
fra2 = Frame(root,width=250,height=100,bg='darkgreen',bd=10)
ent1 = Entry(fra2,width=10,font='14')
tx = Text(root,width=40,height=3)
scr = Scrollbar(root,command=tx.yview)
tx.configure(yscrollcommand=scr.set)
 
tx.grid(row=0,column=0)
scr.grid(row=0,column=0)
 
fra1.pack()
scl1.pack()
fra2.pack()
ent1.pack()
 
root.mainloop() 

Нельзя, чтобы pack и grid

Нельзя, чтобы pack и grid были одновременно.

Попробуйте так:

...
tx.grid(row=4,column=0)
scr.grid(row=4,column=0,sticky=E)
 
fra1.grid(row=0,column=0)
scl1.grid(row=1,column=0)
fra2.grid(row=2,column=0)
ent1.grid(row=3,column=0)
...