• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Пишем графическую оболочку на Python - часть 2

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

Напишем такой код:

Python:
from tkinter import *

root = Tk()
root.title("Метод place")
root.geometry("400x250")
root.resizable(width=False, height=False)

puch = Button(text="Puch", background="#483D8B", foreground="#fff", width=12).place(x=50, y=200)
sova = Button(text="Sova", background="#483D8B", foreground="#fff", width=12).place(x=250, y=200)

text = Text(width=47, height=10, bg="#F8F8FF", fg='black', wrap=WORD)
text.place(x=10, y=10)

root.mainloop()

sova.png


Здесь мы использовали метод place() Как он работает? Берутся координаты по осям x и y. Для понимания - икс это слева по оси координат, а игрек сверху. Таким образом мы можем расположить любые элементы в окне очень точно. Отступ измеряется в пикселях.

Также в коде у нас присутствует класс Text - многострочное текстовое поле. Оно также здесь имеет размеры и цвета. Как мы можем понять из названия в многострочном текстовом поле мы можем писать любой текст, а так же вставлять его туда из буфера обмена.
Значение WORD опции wrap позволяет переносить слова на новую строку целиком, а не по буквам. То есть если у вас какое-то слово в конце строки не помещается, то оно будет перемещено целиком на следующую строку.

Ну что же, прекрасно, мы уже умеем двумя способами позиционировать элементы. Но пока у нас кнопки не рабочие. Настало время их заставить что-нибудь делать.

Немного допишем наш код:

Python:
from tkinter import *

root = Tk()
root.title("Метод place")
root.geometry("400x250")
root.resizable(width=False, height=False)

def medved():
    puch = '\n\n' + 'Пух'
    text.insert(END, puch)

def ptitsa():
    sova = '\n\n' + 'Сова'
    text.insert(END, sova)

puch = Button(text="Puch", background="#483D8B", foreground="#fff", width=12, command=medved).place(x=50, y=200)
sova = Button(text="Sova", background="#483D8B", foreground="#fff", width=12, command=ptitsa).place(x=250, y=200)

text = Text(width=47, height=10, bg="#F8F8FF", fg='black', wrap=WORD)
text.place(x=10, y=10)

root.mainloop()

sova2.png


Тут я написал коротенькую записку, а нажатие на кнопку подписывает сообщение. Можно подписаться Совой, а можно Пухом.

Чтобы кнопки заставить работать, необходимо всего лишь дописать command=имя функции Таким образом нажатие на кнопку может выполнить всё что угодно - написать текст, сделать математические вычисления и т.д. Что она будет делать определяется в функции, которую вы для этого напишите.

В данном примере созданы 2 простейших функции, которые вставляют текст. Посмотрим на саму функцию

Python:
def medved():
    puch = '\n\n' + 'Пух'
    text.insert(END, puch)

'\n\n' здесь двойной перенос строки, чтобы подпись не сливалась с текстом. Вся магия кроется в этой строке text.insert(END, puch)
К текстовому полю мы добавляем метод insert, который принимает 2 обязательных аргументы - место вставки и объект. Применяется для вставки любых переменных, строк и других объектов. Значение END соответствует позиции сразу после последнего символа.

Методы Text - get(), insert(), delete()
get() - возвращает
insert() - вставляет
delete() - удаляет

Кроме многострочного Text существует также и однострочное текстовое поле Entry Оно использует те же методы что и Text

Домашнее задание Сделать всё как на картинке. Кнопка Other должна брать значение из однострочного текстового поля и вставлять в главное окно. Таким образом вместо Совы или Пуха, мы можем подписаться кем угодно.

sova3.png
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Python:
from tkinter import *

root = Tk()
root.title("Метод place")
root.geometry("400x250")
root.resizable(width=False, height=False)


def medved():
    puch = '\n\n' + 'Пух'
    text.insert(END, puch)


def ptitsa():
    sova = '\n\n' + 'Сова'
    text.insert(END, sova)


def free():
    free_text = '\n\n' + other_entry.get()
    text.insert(END, free_text)


puch = Button(text="Puch", background="#483D8B", foreground="#fff", width=12, command=medved).place(x=50, y=200)
sova = Button(text="Sova", background="#483D8B", foreground="#fff", width=12, command=ptitsa).place(x=250, y=200)
other = Button(text="Other", background="#A0522D", foreground="#fff", width=12, command=free).place(x=150, y=200)

text = Text(width=47, height=8, bg="#F8F8FF", fg='black', wrap=WORD)
text.place(x=10, y=10)

other_entry = Entry(width=40, justify=CENTER)
other_entry.place(x=74, y=160)

root.mainloop()

Только не подглядывайте раньше времени ;) Это для самопроверки

fan.png
 

KotCOCOS

New member
15.07.2020
1
0
BIT
0
Отличная тема) я новичок в теме, а можно какой нибудь пример на метод delete() ?
 

Monotik

One Level
03.09.2020
24
0
BIT
0
Привет , не знаю увидет ли это кто то кто в этом шарит , но , скажите пожаоуйста как ровно поставить обьект или семетрично , просто я не понмаю какой размер в пикселях например у width=40 , были бы это пиксели можно было легко пощетать , но так мне слегка не понятно((

Так , я провел пару тестов , я думаю что одно значение в width = 9 пикселям , пожалуйста подтвердите...
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Привет , не знаю увидет ли это кто то кто в этом шарит , но , скажите пожаоуйста как ровно поставить обьект или семетрично , просто я не понмаю какой размер в пикселях например у width=40 , были бы это пиксели можно было легко пощетать , но так мне слегка не понятно((

Так , я провел пару тестов , я думаю что одно значение в width = 9 пикселям , пожалуйста подтвердите...


В методе place размеры идут и так в пикселях, если дело касается размера окна, а вот с частью элементов, да там относительные размеры. Однако этот вопрос можно решить через фрейм, и тогда всё легко считается и указывается в пикселях. Вот пример кода:

Python:
from tkinter import *

root = Tk()
root.title("Center")
frame = Frame(root, width=300, height=200)
frame.pack()
button1 = Button(frame, text="Center")
button1.place(x=100, y=85, height=30, width=100)
root.mainloop()

111.png
 
  • Нравится
Реакции: Muxtar
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!