Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Команды управления «черепашкой»



Полный список команд управления «черепашкой» можно получить через help('turtle'). Вот некоторые из них:

Up() – поднятие пера, чтоб не оставалось следа перемещения

Down() – опускание пера, чтоб при перемещении оставался след

Goto( x, y) – перемещение пера в точку с координатами (x,y)

Color(‘строка цвета’) – изменение цвета пера

Width( n) – установка толщины пера в точках экрана

Forward(n) – перемещение пера вперёд на n точек

Backward(n) – перемещение пера назад на n точек

Right(k) – перемещение пера вправо на k точек

Left(k) – перемещение пера влево на k точек

Circle(r) – рисует окружность радиуса |r|

Write(‘строка’) – печатает текст в текущем положении “пера”

Clear() – очистка области рисования

 

#_*_ coding: utf8_*_

import turtle

#

turtle.reset()

turtle.tracer(0)

turtle. width(2) #ширина пера

# лицо

turtle. up() #поднятие пера

x=0

y=100

turtle. goto( x, y) # установка пера в точку (0,100)

turtle. fill(1) # начало рисования закрашенной области

turtle. color('# ffaa00') # установка оранжевого цвета

turtle. down() # опускание пера

turtle. circle(100) # изображение окружности

turtle. fill(0) # завершение рисования закрашенной области

turtle.color('black')

turtle.circle(100)

turtle.up()

# глаза

x=45

y=50

turtle.goto(x,y)

turtle.down()

turtle.color('#0000aa')

turtle.fill(1)

turtle.circle(7)

turtle.up()

turtle.fill(0)

#

x=-55

y=-50

turtle.goto(x,y)

turtle.right(45 )

turtle.width(3)

turtle.down()

turtle.color('#aa0000')

turtle.circle(80,90)

turtle.up()

#

turtle.right(135)

x=0

y=50

turtle.goto(x,y)

turtle.width(2)

turtle.color('black')

turtle.down()

turtle.forward(100)

#

turtle._root.mainloop()

 Пример рисунка

 

Рисование

 

turtle.color(color) – цвет курсора color ;

turtle. penup() – Поднимаем курсор, что бы при перемещении курсора не происходило рисование линий;

turtle. pendown() – Опускаем курсор, что бы при перемещении курсора происходило рисование линий;

turtle. goto( x, y) – Перейти в точку с координатами x и y;

turtle. circle( radius) – Нарисовать круг с радиусом = radius;

turtle. right( degrees) – Повернуть курсор на право на degrees градусов;

turtle. left( degrees) – Повернуть курсор на лево на degrees градусов;

turtle. forward( length) – Нарисовать линий длиной = length;

turtle. done() – завершение программы, использующий turtle.

 

import turtle #подключить модуль turtle

Команды для перемещения курсора:

forward(n) #вперед на n пикселей

backward(n) #назад на n пикселей

left(n) #влево на n градусов

right(n) #вправо на n градусов

circle(r) #начертить окружность радиуса r, с центром кслева от курсора, если r>0, справа, если r<0

circle(r,n) #начертить дугу радиуса r, градусной мерой n против часовой стрелки, если r>0, по часовой стрелке, если r<0

goto(x,y) #переместить курсор в точку с координатами (x,y)

Команды рисования:

down() #опустить курсор для рисования

up() #поднять курсор

width(n) #ширина следа курсора в n пикселей

сolor(s) #где s #цвет рисования курсора пример: "red", "blue"

begin_fill(),end_fill() #рисует закрашенные области (начало и конец рисунка)

Дополнительно:

reset() #очищается экран, возвращает курсор

сlear() #очистить экран

write(s) #вывести строку s в точке нахождения курсора

radians() #мера измерения углов в радианы

degrees() #мера измерения углов в градусах

mainloop() #задержка окна

tracer(f) #режим отладки

Цвета, используемые в графике:

Aqua, blue, fuchsia, green, maroon, orange, pink, purple, red, yellow, violet, indigo, chartreuse, lime, import turtle # Импортируем библиотеку turtle turtle.color("black") # Устанавливаем цвет черепашки turtle . penup () # Поднимаем курсор turtle . goto (-110, -25) # Переходим по нужным координатам turtle . pendown () # Опускаем курсор turtle . circle (45) # Рисуем круг с радиусом 45 turtle.color("black") turtle.penup() turtle.goto(0, 80) turtle.pendown() turtle.write("ТҮГӘРӘК") # В ывод надпис и " ТҮГӘРӘК"

import turtle turtle.begin_fill() turtle.penup() turtle. width(3)# ширина пера turtle.right(90)#90гр. вправо turtle.goto(40, 40) turtle.pendown() turtle.forward(70)#вперед на 70 turtle.right(90) turtle.forward(70) turtle.right(90) turtle.forward(70) turtle.right( 9 0) turtle.forward(70) turtle.done() import turtle turtle.begin_fill() turtle.penup() turtle.width(3) turtle.goto(20,20) turtle.pendown() for i in range(6) : turtle.forward(70) turtle.right(60) turtle.done()
import turtle
turtle.begin_fill()

turtle.penup()

turtle.width(5) # ширина пера

turtle.right(90) # Повернуть курсор на 90 гр. Вправо

turtle.goto(40, 40)

turtle.pendown()

turtle.forward(70) # Пройти вперед расстояние 70

for i in range(35) :

turtle.right(10)

turtle.forward(70)

turtle.done()

import turtle turtle.begin_fill() turtle.penup() turtle.goto(0,0) turtle.pendown() turtle . forward (60) # Пройти вперед расстояние 70 turtle . right (120) # Повернуть курсор на 120 гр. в право turtle.forward(60) turtle.right(120) turtle.forward(60) turtle.end_fill() turtle.done()

from turtle import *
color('orange', 'red')
width(3)
begin_fill()
while True:
forward(250)
left(144)
if abs(pos()) < 1:
   break
end_fill()
done()

Рисование дома.

from turtle import *

turtle.begin_fill()

turtle.penup()

turtle. goto(35, 35)

turtle. right(90) # Поворот курсора на 90 градусов вправо

turtle. pendown()

turtle. forward(70) # Пройти вперед расстояние 70

turtle.right(90)

turtle.forward(70)

turtle.right(90)

turtle.forward(70)

turtle.right(90)

turtle.forward(70)

turtle.penup()

turtle.goto(45, 35)

turtle.right(225)

turtle.pendown()

turtle.forward(70)

turtle.left(90)

turtle. forward(70)

turtle. left(135) # Повернуть курсор влево на 135 градусов

turtle.forward(100)

turtle.done()

Изображение стэлса

import turtle

def left_forw(angl,f) :

turtle .left(angl)

turtle .forward(f)

def right_forw(angl,r) :

turtle .left(angl)

turtle .forward(r)

k =20 #масштаб

q =-10 #угол

w=100 #перенос рисунка

#чёрная часть

turtle . penup ()

turtle . goto (- w , w )

turtle .color('black') ##000000')

turtle .left(q)

turtle .pendown()

turtle .begin_fill()

turtle .forward(k*6)

turtle .right_forw(45,k*8**(1/2))

turtle .left_forw(135,k*2)

turtle .left_forw(180,k)

turtle .left_forw(90,k*2)

turtle .left_forw(90,k)

turtle .left_forw(180,k*2)

turtle .left_forw(135,k*8**(1/2))

turtle .right_forw(45,k*6)

turtle .right_forw(150,k*20**(1/2))

turtle .left_forw(120,k*5**(1/2))

turtle .right_forw(150,k*3)

turtle .end_fill()

# жёлтая часть

turtle .color('yellow') ##ffe300')

turtle .begin_fill()

turtle .left_forw(30,k*20**(1/2))

turtle .right_forw(60,k*20**(1/2))

turtle .left_forw(30,k*3)

turtle .right_forw(150,k*5**(1/2))

turtle .left_forw(120,k*20**(1/2))

turtle .end_fill()

turtle .done()

Изображение человека

import turtle def fraktal(): turtle.forward(50) turtle.left(90+i) turtle.forward(50) turtle.left(90+i) turtle.forward(50) turtle.left(90+i) turtle.forward(50) turtle.left(90+i) turtle.forward(50) fraktal() turtle.reset() turtle.pendown() for i in range(0, 18): turtle.forward(30) turtle.left(20) turtle.forward(15) turtle.left(270) turtle.forward(50) turtle.right(50) # Hand turtle.forward(150) turtle.left(270) turtle.forward(150) turtle.right(180) turtle.forward(150) turtle.left(90) turtle.forward(150) # Right hand turtle.right(70) turtle.forward(150) turtle.right(90) turtle.forward(150) turtle.setx(15) turtle.sety(-50) # Body turtle.left(30) turtle.forward(250) turtle.left(90) turtle.forward(50) turtle.right(30) turtle.forward(250) turtle.left(70) turtle.forward(50) # Back turtle.penup() turtle.setx(15) turtle.sety(-300) turtle.pendown() # продолжение # Leg turtle.left(270) turtle.forward(250) turtle.left(80) turtle.forward(50) turtle.penup()# Some turtle.setx(150) turtle.sety(150) turtle.pendown() turtle.begin_fill() turtle.fillcolor() turtle.penup() turtle.setx(50) turtle.sety(100) turtle.pendown() turtle.right(40) for i in range(0, 18): turtle.forward(5) turtle.left(20) turtle.penup() turtle.left(180) turtle.forward(50) turtle.pendown() for i in range(0, 18): turtle.forward(5) turtle.left(20) turtle.penup() turtle.setx(10) turtle.sety(20) turtle.pendown() turtle.color("red") turtle.right(150) turtle.forward(50) turtle.color("black") turtle.penup() turtle.setx(20) turtle.sety(50) turtle.pendown() turtle.forward(10) turtle.penup() turtle.color('red', 'yellow') turtle.setx(200) turtle.sety(200) turtle.pendown() fraktal() turtle.begin_fill() turtle.mainloop()

Упражнения :

1. Нарисуйте на экране равносторонний треугольник.

2. Нарисуйте на экране квадрат с диагоналями.

3. Нарисуйте две касающиеся окружности.

4. Нарисуйте две пересекающиеся окружности.

5. Нарисуйте дом.

6. Нарисуйте компьютер.












Canvas графика

Импорт модуля tkinter в Python происходит после команды

from tkinter import *.

Главное окно создает команда

root = Tk()

Интерактивные компоненты

В окне кнопка может располагаться через класс Button модуля tkinter. Кнопка связывается с какой-нибудь переменной. У класса Button есть обязательный параметр – объект, которому кнопка принадлежит.

b = Button( root)

У кнопки много свойств: размер, цвет фона и надписи и др. Для надписи текста на кнопке используется свойство – text :

b[" text"] = " Рисовать"

Предположим, что задача кнопки ввести данные, используя функцию input при нажатии на нее левой кнопкой мыши.

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

def reader( event):

input ( a)

Событие нажатия левой кнопкой мыши выглядит так: для связи предназначен метод bind. Синтаксис связывания события с обработчиком выглядит так:

b. bind("< Button-1>", reader)

Кнопка отображается в окне используя метод pack.

b. pack()

Без этой строчки кнопка в окне не появится.

Главное окно появится после вызова методом mainloop:

root. mainloop()

Код программы может выглядеть таким образом:

from tkinter import *

def reader(event):

 input (a)

root = Tk()

b = Button(root)

b["text"] = " Ввод "

b.bind("<Button-1>",reader)

b.pack()

root.mainloop()

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

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

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

from tkinter import *

root = Tk()

b = Button(root,text="Это кнопка", #надпись на кнопке

      #ширина и высота

      bg="white",fg="blue") #цвет фона и надписи

b.pack()

root.mainloop()

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

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

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

Класс Entry модуля tkinter позволяет ввести строку текста.

Ent = Entry(root,# bd – ширина границы .

Text предназначен для многострочного текстового поля.

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

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

Радиокнопки (переключатели) используют группами, при этом в одной группе может быть «включена» лишь одна кнопка.

v=IntVar()

v.set(1)

r0 = Radiobutton(root,text="1-ая",variable=v,value=0)

r1 = Radiobutton(root,text="2-ая",variable=v,value=1)

r2 = Radiobutton(root,text="3-я",variable=v,value=2)

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

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

c1 = IntVar()

c2 = IntVar()

ch1 = Checkbutton(root,text="1-ый флажок",variable=c1,onvalue=1,offvalue=0)

ch2 = Checkbutton(root,text="2-ой флажок",variable=c2,onvalue=2,offvalue=0)

Меню – объект, находящийся под строкой заголовка и представляет собой выпадающие списки со словами; каждый такой список может содержать другой вложенный в него список. Каждый пункт списка представляет собой команду, запускающую какое-либо действие или открывающую диалоговое окно.

Создание меню в Tkinter

from tkinter import *

root = Tk()

m = Menu(root) # создается объект Меню на главном окне

root.config(menu=m) # окно конфигурируется с указанием меню для него

f = Menu(m) #создается пункт меню с размещением на основном меню (m)

m.add_cascade(label="File",menu=f) #пункт располагается на меню (m)

f.add_command(label="Open...") #формируется список команд пункта меню

f. add_ command( label=" New")

f.add_command(label="Save...")

f.add_command(label="Exit")

h = Menu(m) #2-ой пункт меню

m.add_cascade(label="Help",menu=h)

h.add_command(label="Help")

h.add_command(label="About")

root.mainloop()

Метод add_cascade добавляет новый пункт в меню, который указывается как значение опции menu.

Метод add_command добавляет новую команду в пункт меню. Одна из опций данного метода (в примере выше ее пока нет) – command – связывает данную команду с функцией-обработчиком.

Можно создать вложенное меню. Для этого создается еще одно меню и с помощью add_cascade привязать к родительскому пункту.

nf = Menu(fm)

f.add_cascade(label="Import",menu=nf)

nf.add_command(label="Image")

nf.add_command(label="Text")

Привязка функций к меню

Каждая команда меню обычно должна быть связана со своей функцией, выполняющей те или иные действия (выражения). Связь происходит с помощью опции command метода add_command. Функция обработчик до этого должна быть определена.

Для примера выше далее приводятся исправленные строки добавления команд ―About‖ ―New‖и ―Exit‖ а также функции, вызываемые, когда пользователь щелкает левой кнопкой мыши по соответствующим пунктам подменю.

def new_win():

win = Toplevel(root)

def close_win():

root.destroy()

def about():

win = Toplevel(root)

lab = Label(win,text="Это просто программа-тест \n меню в Tkinter")

lab.pack()

….

f.add_command(label="New",command=new_win)

….

f.add_command(label="Exit",command=close_win)

….

h.add_command(label="About",command=about)

Формирование полей нтерактивного ввода обеспечивает следущий фрагмент программы.

язу = Label ( text ="y = a * sin ( bx )+ c ")
язу. pack ()
язу_ a = Label ( text ="
a =")
язу_ a . pack ()
txt _ a = Entry ()
txt _ a . pack ()
язу_ b = Label ( text ="
b =")
язу_ b . pack ()
txt _ b = Entry ()
txt _ b . pack ()
язу_ c = Label ( text ="
c =")
язу_ c . pack ()
txt _ c = Entry ()
txt _ c . pack ()
bt 1= Button ( root , text ="Построить", command = dr )
bt 1. pack ()
bt 2= Button ( root , text ="Очистить", command = cl )
bt 2. pack ()


















Графические примитивы

Фу нкции :с anvas(root,\   cursor= "pencil") # определение холста canv.create_line(0,0,30,50,width=3,fill="blue", arrow=LAST) # линия canv.create_rectangle(x,y,x+8,y+5,fill="red", \   outline =" red ") # прямоугольник # outline – цвет границы canv.create_polygon([250,100],[200,150],[300,150], \    fill="red") # fill – цвет заливки canv.create_oval([20,200],[150,300],fill="gray50") # овал

Пример 1. Построение координатных осей.

from math import *
from tkinter import *
root = Tk()
canv = Canvas(root, width = 100, height = 100, \          bg = "lightblue", cursor = "pencil")
canv.create_line(50,100,50,0,width=2,arrow=LAST)
canv.create_line(0,50,100,50,width=2,arrow=LAST)
canv.pack()
root.mainloop()

Пример 2. Построение осей координат.

from math import *
from tkinter import *
f = input('f(x):')
root = Tk()
C = Canvas(root,height=1000, bg = "white")
C.create_line(500,1000,500,0,# ось x
C.create_line(0,500,1000,500,# ось y
for x in range(0,1000,50):
k = x - 500
C.create_line(x,497,x,503,fill = 'black')
C.create_text(x + 15,490,text=str(k), fill="purple", font=("Arial", "10"))
if (k != 0):
   C.create_line(497,x,503,x,width=1,fill='black')
   C.create_text(520, x, text = str(k), fill="purple",font=("Arial","10"))
C.pack()
root.mainloop()

Пример 3. Построение синусоиды.

from math import *
from tkinter import *
import random
def dr():
a=float(txt_a.get())
b=float(txt_b.get())
c=float(txt_c.get())
f=random.choice(['red','black','green','darkblue']);
for i in range( 0,1000 ):
if(i%800==0):
k=i
С .create_line(k,247,k,253, fill='black')
С .create_text(k+15,240,text=str(k), fill="red", font=("Arial", "10"))
if(k!=0):
   С .create_line(497,k - 250,503,k - 250, fill = 'black')
  С .create_text(520,k - 250,text=str(k), fill="red", font=("Arial","10"))
try:
    x = i - 500
    new_f = f.replace('x', str(x))
    y = -eval(new_f) + 250
    x += 500
    С .create_oval(x, y, x + 1, y + 1, fill = 'red')
except:
    pass
    
for i in range(100): С .create_line(i-1,250+int((c+a*sin(b*(i-321)/180*3.14))

      *200),i, 250+int((c+a*sin(b*(i-320)/180*3.14)) *200),  fill=f)
def cl():
С .create_rectangle(0, 0, 1000, 500, fill='white')
С .create_line(500,500,500,0,width=2,arrow=LAST)
С .create_line(0,250,1000,250,width=2,arrow=LAST)
root = Tk()
язу = Label(text="y=a*sin(bx)+c")
язу .pack()
язу _a = Label(text="a=")
язу _a.pack()
txt_a=Entry()
txt_a.pack()
язу _b = Label(text="b=")
язу _b.pack()
txt_b=Entry()
txt_b.pack()
язу _c = Label(text="c=")
язу _c.pack()
txt_c=Entry()
txt_c.pack()
btn=Button(root, text="
Построить ", command=dr)
btn.pack()
btn1=Button(root, text="
Очистить ", command=cl)
btn1.pack()
С = Canvas(root, width = 1000, height = 500, bg = "white", cursor = "arrow")
С .create_line(500,500,500,0,width=2,arrow=LAST)
С .create_line(0,250,1000,250,width=2,arrow=LAST)
С .pack()
root.mainloop()

Пример 4 . Построение случайных кругов

from random import *

from tkinter import *

s = 400

root = Tk()

С = Canvas(root, height=s)

С .pack()

while 1:

c = choice(['aqua', 'blue', 'fuchsia', 'green', 'maroon', 'orange','pink','purple', \ 'red','yellow', 'violet', 'indigo', 'chartreuse', 'lime'])

x = randint(0, s)

y = randint(0, s)

d = 10+randint(0, s/5)

С .create_oval(x, y, x+d, y+d, fill=c)

root.update()

Пример 5 . Построение случайных кругов и прямоугольников с границей кнопкой управления

from random import * # импорт методов модуля random

from tkinter import *

def change():

b1['text'] = "Үзгәртелгән - Изменено "

b1['bg'] = '#000000'

b1['activebackground'] = '#aaaaaa'

b1['fg'] = '#ffffff'

b1['activeforeground'] = '#ffffff'

K=1-K

s = 600

root = Tk() # создает окно

canvas = Canvas(root, height=s) # создает холст размера s

canvas.pack() # расположение холста в окне

D = 0

K = 1

b1 = Button(text="Үзгәртү - Изменить ", height=3)

b1.config(command=change)

b1.pack()

while True : #D < 3000:

d = randint(10, s // 5)

c = choice(['aqua','blue','green','orange','red','yellow', 'violet'])

g = choice(['aqua','blue','green','orange','red','yellow', 'violet'])

x = randint(-d, s)

y = randint(-d, s-20)

k = randint(0, 3)

if K*k==0 :

canvas.create_oval(x, y, x+d, y+d, fill=c, outline=g, width=3)

elif k==1 :

canvas.create_rectangle(x,y,x+d,y+d,fill=c,outline=g,width=3,activedash=(5,4))

root.update()

D += 1

Пример 6 . Масштабирование рисунка

from PIL import Image, ImageDraw

image = Image.open("cat.jpg")

draw = ImageDraw.Draw(image) # прорисовка рисунка

width = image.size[0] # ширина рисунка

height = image.size[1] # высота рисунка

pix = image.load()

image.show() # показ данного рисунка

Smalled=image.resize((width//2, height//2), Image.ANTIALIAS)

Smalled. show(); # показ уменьшенного вдвое рисунка

Biged=image.resize((width*2, height*2), Image.ANTIALIAS)

Biged. show(); # показ увеличенного вдвое рисунка

cropImg=image.crop((100,0,360,400))

cropImg.show();

Пример 7 . Построение градиенты цветов.

import tkinter as tk

# from math import sqrt

def average(hex1, hex2, percent):

percent = 1 if percent > 1 else 0 if percent < 0 else percent

rgb1 = [int(hex1[i:i + 2], 16) for i in range(1, 7, 2)]

rgb2 = [int(hex2[i:i + 2], 16) for i in range(1, 7, 2)]

f = '#'

for i in range(3):

   temp = hex(int(rgb1[i] + (rgb2[i] - rgb1[i]) * percent))[2:]

   f += '0' + temp if len(temp) == 1 else temp

return f

res = 500

x1, y1, color1 = 100, 100, '#FF003A'

x2, y2, color2 = 400, 280, '#D9FF3A'

root = tk.Tk()

canv = tk.Canvas(height=res, bg='grey10')

for i in range(res + 2):

canv.create_line(i, 0, i, res + 2, fill=average(color1, color2, i / res))

canv.pack()

root.mainloop()

Пример 8 . Тиражирование рисунка.

from tkinter import *
from PIL import ImageTk, Image
root = Tk()
canvas = Canvas(root, height=1000)
canvas.pack()
pilImage = Image.open("univer.jpg")
image = ImageTk.PhotoImage(pilImage)
for y in range(100,1000,200) :
for x in range(100,1000,200) :
   image.show = canvas.create_image(x, y, image=image)
mainloop()

Задан файл «univer. jpg» с рисунком

Программа выведет следующее изображение

Рассмотрим еще одну задачу

Canvas (холст) — объект библиотеки tkinter, позволяющий располагать на себе другие объекты. Это могут быть геометрические фигуры, узоры, вставленные изображения и другие видео объектов (например, метки, кнопки, текстовые поля). И это еще не все. Отображенные на холсте объекты можно изменять и перемещать (при желании) в процессе выполнения скрипта. Учитывая все это, canvas находит широкое применение при создании GUI-приложений c использованием tkinter (создание рисунков, оформление других ВО, реализация функций графических редакторов, программируемая анимация и др.).

Для создания объект-холст вызывается класс модуля tkinter и устанавливаются некоторые параметры. Например:

from tkinter import *
root = Tk()
c=Canvas(root,width=600,height=600,bg="white",cursor="pencil")

Далее с помощью любого менеджера геометрии разместить на главном окне.

Нулевая точка (0,0) для объекта Canvas располагается в верхнем левом углу. Единицы измерения пиксели (точки экрана).

Чтобы нарисовать линию на холсте применяется метод create_line.

c.create_line( 8 0,80,1 8 0, 8 0, fill='green', # зеленая линия            width =5, arrow = LAST , dash =(10,2), # пунктирная линия со стрелкой            activefill='lightgreen',            arrowshape="10 20 10")

Четыре числа — это пары координат начала и конца линии, т.е в примере первая линия начинается из точки (200,50), а заканчивается в точке (300,50). Вторая линия начинается в точке (0,0), заканчивается — в (100,100). Свойство fill позволяет задать цвет линии отличный от черного, а arrow – установить стрелку (в конце, начале или по обоим концам линии).

Так для изображения осей можно написать

c.create_line(500,600,500,0,width=4,arrow=LAST) c.create_line(0,500,600,500,width=4,arrow=LAST)

Метод create_rectangle создает прямоугольник. Аналогично линии в скобках первыми аргументами прописываются четыре числа. Первые две координаты обозначают верхний левый угол прямоугольника, вторые — правый нижний.

x = 70 y = 110 c.create_rectangle(x,y,x+80,y+50,fill="white",outline="blue")

Опция outline определяет цвет границы прямоугольника.

Многоугольник определяется парами координат для каждой его точки.

c.create_polygon([250,100],[200,150],[300,150],fill="red")

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

canv . create _ polygon (300,80,400,80,450,75,450,200,300,180,330, \ 160, outline =" brown ", smooth =0, width =4) c.create_polygon(300,380,400,380,450,375,450,500,300,480,330, \ 460,outline="orange",smooth=1,width=4)

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

c.create_oval(10, 10, 110, 110, width=2) c.create_oval(10, 120, 190, 190, fill='yellow', outline='white')

Более сложная фигура получается методом create_arc. В зависимости от значения опции style можно получить сектор (по умолчанию), сегмент (CHORD) или дугу (ARC). Координаты по-прежнему задают прямоугольник, в который вписана окружность, из которой «вырезают» сектор, сегмент или дугу. От опций start и extent зависит угол фигуры.

c.create_arc(160,230,230,330,start=0,extent=240, fill="lightgreen") c.create_arc(250,230,320,360,start=30,extent=300,style=CHORD, fill="green", width=5) c.create_arc(340,230,410,330,start=0,extent=140,style=ARC, outline="darkgreen", width=2)

Последний метод объекта canvas, который будет рассмотрен в этом уроке — это метод создающий текстовую надпись.

c.create_text(20,430,text="РӘСЕМНӘР",font="arial 36", anchor="w", justify=CENTER,fill="darkred")

Трудность здесь может возникнуть с пониманием опции anchor (якорь). По умолчанию в заданной координате располагается центр текстовой надписи. Чтобы изменить это и, например, разместить по указанной координате левую границу текста, используется якорь со значением w (от англ. west – запад). Другие значения: n, ne, e, se, s, sw, w, nw. Если букв, задающих сторону привязки две, то вторая определяет вертикальную привязку (вверх или вниз «уйдет» текст от координаты). Свойство justify определяет выравнивание текста.

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

y=10 while y<450: c.create_rectangle(520,y,570,y+50,fill="lightgrey") c.create_line(y,520,y+50,570,fill="green",width=10) c.create_line(y+50,520,y,570,fill="darkgreen", width=10)  y + = 60

Программа завершается

canv.pack()
root.mainloop()

Приведенный код даст следующее изображение:

from tkinter import *
def move():
x = int(txt_x.get())
y = int(txt_y.get())
c.move(ball, x, y)
c.move(rect, x, y)
c.move(rect_in, x, y)
c.move(line1, x, y)
c.move(line2, x, y)
#c.move(ALL, x, y)
root = Tk()
txt_x = Entry()
txt_x.pack()
labelx = Label(text="x")
labelx.pack()
txt_y = Entry()
txt_y.pack()
labely = Label(text="y")
labely.pack()
c = Canvas(root, height=500)
c.pack()
rect = c.create_rectangle(10, 55, 75, 120, fill='orange')
ball = c.create_oval(10, 55, 75, 120, fill='yellow')
rect_in = c.create_rectangle(20,65,65,110, fill='white')
line1 = c.create_line(10,55,43,20)
line2 = c.create_line(43,20,75,55)
btn = Button(root, text="Переместить", command = move)
btn.pack()
root.mainloop()

Текст в CANVAS

# -*- coding: utf8 -*-

import turtle

from tkinter import *

root=Tk()

root.title('Домик ')

c = Canvas(root,width=500,height=500,bg="lightblue",cursor="pencil")

c.create_rectangle(20,150,300,450,fill="green",outline="black")

c.create_polygon([20,150],[160,30],[300,150],fill="blue",outline="blue")

c.create_polygon([300,450],[300,300],[400,300],[400,375],[480,375], \ [480,450],fill="red",outline="red")

c.create_oval(400,10,480,80,fill="yellow",outline="yellow")

c.create_line(300,150,300,30,width=2,fill="black")

c.create_line(300,30,270,0,width=2,fill="black")

c.create_line(300,30,330,0,width=2,fill="black")

c.create_arc([20,20], [100,100], start=220, extent=180, style=ARC, \ outline="darkred",width=2)

c.create_text(40,320,text="Домик в деревне .",font="Verdana 12", \ anchor="w",justify=CENTER,fill="darkblue")

c.create_text(40,340,text="Вот моя деревня ,",font="Verdana 12", \ anchor="w",justify=CENTER,fill="darkblue")

c.create_text(40,360,text="Вот мой дом родной .",font="Verdana 12", \ anchor="w",justify=CENTER,fill="darkblue")

c.create_text(40,380,text="Вот качусь я в санках ",font="Verdana 12", \ anchor="w",justify=CENTER,fill="darkblue")

c.create_text(40,400,text="По горе крутой ...",font="Verdana 12",  \ anchor="w",justify=CENTER,fill="darkblue")

c.pack()

root.mainloop()

Поворот рисунка

90 градусов,                     45 градусов

__author__ = 'PVKlenkov'
import tkinter as tk
import math, cmath
root = tk.Tk()
c = tk.Canvas(root, height=900)
def update_button_text():
global angle_entry, angle_confirm_button
angle_confirm_button["text"] = "Rotate on %s" % angle_entry.get()
root.after(100, update_button_text)
def init_image():
for color in polygons:
  c.create_polygon(polygons[color], fill=color, tag=color+"_square")
def draw_image(points, color):
c.delete(color+"_square")
return c.create_polygon(points, fill=color, tag=color+"_square")
def rotate_image(polygons, angle, center):
global inputed_angles
angle = math.radians(angle)
inputed_angles += angle
cos_v = math.cos(inputed_angles)
sin_v = math.sin(inputed_angles)
for color in polygons:
   cx, cy = center
   new_points = []
   for x_old, y_old in polygons[color]:
       x_old -= cx
       y_old -= cy
       x_new = x_old * cos_v - y_old * sin_v
       y_new = x_old * sin_v + y_old * cos_v
       new_points.append((x_new + cx, y_new + cy))
       draw_image(new_points, color)
rect_width = 250
center = (450,450)
colors = [["red","blue"],["yellow","green"]]
polygons = {
"red": ((150,150), (150,400), (400,400), (400,150)),
"yellow": ((150,400), (150,650), (400,650), (400,400)),
"blue": ((450,200), (700,200), (700,450), (450,450)),
"green": ((450,450), (700,450), (700,700), (450,700))
}
root.resizable(False, False)
angle_entry = tk.Entry(root)
angle_entry.delete(0,tk.END)
angle_entry.insert(0,"0")
angle_confirm_button = tk.Button(root, text=angle_entry, \
                            command = lambda: rotate_image(polygons, \
                            int(angle_entry.get()), center))
init_image()
inputed_angles = 0
c.pack()
angle_entry.pack()
angle_confirm_button.pack()
update_button_text()
root.mainloop()

 

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

from tkinter import *
c = Canvas(height=1000)
c.pack()
xy = [(100, 100), (250, 150), (250, 250), (150, 250)]
polygon_item = c.create_polygon(xy)
center = 400, 400
def getangle(event):
dx = c.canvasx(event.x) - center[0]
dy = c.canvasy(event.y) - center[1]
try:
   return complex(dx, dy) / abs(complex(dx, dy))
except ZeroDivisionError:
   return 0.0
def press(event):
global start
start = getangle(event)
def motion(event):
global start
angle = getangle(event) / start
offset = complex(center[0], center[1])
newxy = []
for x, y in xy:
   v = angle * (complex(x, y) - offset) + offset
   newxy.append(v.real)
   newxy.append(v.imag)
c.coords(polygon_item, *newxy)
c.bind("<Button-1>", press)
c.bind("<B1-Motion>", motion)
mainloop()

 Поточечное перемещение рисунка.

from tkinter import *
root = Tk()
c = Canvas(root, height=500)
c.pack()
def rotate_image(img, st):
w, h = img.width(), img.height()
if st in ['left', 'right']:
   fun = PhotoImage(height=w)
else: # 180 gradusov
   fun = PhotoImage(height=h)
for x in range(w):
      for y in range(h):
       rgb = '#%02x%02x%02x' % img.get(x, y)
       if st == 'right':
           fun.put(rgb, (h-y,x))
       elif st == 'left':
           fun.put(rgb, (y,w-x))
       else:
           fun.put(rgb, (w-x,h-y))
return fun

img = PhotoImage(file=r"rasem.png")
a = rotate_image(img,'simmetrichno')
b = rotate_image(img,'right')
b = rotate_image(img,'left')
Img = c.create_image(100,100, image=a)
#Img = c.create_image(100,100, image=b)
#Img = c.create_image(100,100, image=c)
root.mainloop()

Пример 10. Рассмотрим центральную симметрию для случайного треугольника.

from math import *
from tkinter import *
import random
from tkinter import messagebox as mb
def click_button_1():
c.delete("all")
ax = random.randint(0,800)
ay = random.randint(0,800)
bx = random.randint(0,800)
by = random.randint(0,800)
cx = random.randint(0,800)
cy = random.randint(0,800)
c.create_polygon(ax, ay, bx, by, cx, cy)
c.create_line(400,800,400,0, arrow=LAST)
c.create_line(0,400,800,400, arrow=LAST)
if mb.askyesno(title="Вопрос",
message="Построить симметричный треугольник?\n \
       Симметрик э чпочмак сызыргамы?\n \
       Construct a symmetrical triangle"): def click_symmetry_button(ax, ay, bx, by, cx, cy):
c.create_polygon( 800- ax, 800- ay,                   800- bx, 800- by,                   800- cx, 800- cy,
                  fill = 'red')
root = Tk()
c = Canvas(root, height=800, bg="white")
c.create_line(400,8000,400,0,width=2,arrow=LAST)
c.create_line(0,400,800,400,width=2,arrow=LAST)
btn1 = Button(text="Треугольник\nЭчпочмак\nTriangle",
         background="#fff", foreground="#000",
         padx="20", pady="8", font="16", command=click_button_1)

btn1.pack(side = LEFT)
c.pack()
root.mainloop()

Получается следующее изображение






























































































































































































































































Библиотека PIL

Библиотека PIL – модуль Python Imafing Library, архивирующий изображения, создания эскизов, обработка мзображений, преобразование цветовых решений, аффинное преобразвание рисунка, вращение.

From PIL import Image # Подключение модуля

f=open(‘foto.jpg’,’rb) # Открытие файла рисунка

Рисунок = f.read()

Рисунок = Image.open(f) # Запись рисунка из файла

Рисунок. size(800,800) # Определяется размер рисунка

f. close() # Закрытие файла

Рисунок[30,40] =(255,100,0) # определяет оранжевый цвет в точке (30, 40)

Рисунок.getpixel((i,j)) # получает цвет пикселя

Рисунок. putpixel(( i, j),(100,150)) # окрашивает цвет пикселя

Рәсем = Рисунок . copy # создание копии в Рәсем

Рисунок. show # просматриает изображение

Рисунок.save(‘rasem.jpg’) # сохранение

Рисунок= image. new(‘ RGB,(100,100),” green”) # cоздание нового изображения c зеленым фоном

Рисунок . rotate(45б expand= true) # поворот рисунка на 45 градусов с увеличением размера.

Пример 1. Перевод цветного рисунка в оттенки серого.

from PIL import Image, ImageDraw
рис = Image. open(" бүре. jpg") # волк
кар = ImageDraw. Draw(рис)
шир = рис. size[0]
выс = рис. size[1]
pix = рис. load()
for i in range(шир):
for j in range(выс):
   r = pix[ i, j][0]
   g = pix[ i, j][1]
   b = pix[ i, j][2]
   S = ( r + g + b) // 3 # среднеарифметический цвет RGB-точки
   кар. point(( i, j), ( S, S, S))# среднеарифмитисекого серого цвета
рис. save(" соры_бүре. jpg", " JPEG") # серый волк

 

Пример 2. Перевод серого рисунка в черно белый.

from PIL import Image, ImageDraw
рис = Image. open(" соры_бүре. jpg") # серый волк
кар = ImageDraw. Draw(рис)
шир = рис. size[0]
выс = рис. size[1]
pix = рис. load()
for i in range(шир):
for j in range(выс):
  if ( pix[ i, j][0] + pix[ i, j][1] + pix[ i, j][2]) > 384 :
    S = 568 # точка белого цвета

   else :
    S = 568 # точка черного цвета

   кар. point(( i, j), ( S, S, S))# среднеарифмитисекого серого цвета
рис. save(" акбүре. jpg", " JPEG") # белый волк

 

Пример 3. Для перенесения одного фрагмента рисунка на другой можно написать следующую программу.

from PIL import Image

s=Image.open("1.jpg") # открытие файла с первым рисунком

g= Image. open("2. jpg") # открытие файла со вторым рисунком

area=(150,150,350,350) # определение выбираемой области

s. paste( g, area) # нанесение рисунка "2. jpg" на "1. jpg"

s.show() # получение изображения рисунка


Поделиться:



Последнее изменение этой страницы: 2019-03-21; Просмотров: 1044; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.266 с.)
Главная | Случайная страница | Обратная связь