Воскресенье, 24.11.2024, 08:53 | Приветствую Вас Гость

...

Блог


21:20
Руководство по модулю turtle


import turtle
sc=turtle.getscreen()
sc.setup(500,500)

turtle.goto(-100,100)
turtle.forward(100)

 
turtle.mainloop()
Инструкция import turtle используется для включения черепашьей графики в python.Инструкция sc=turtle.getscreen() нужна для получения дескриптора экрана,на котором рисует так называемая черепашка.Чтобы установить ширину и высоту графического окна необходимо использовать метод setup экранного объекта.
Координаты (0,0) находятся прямо в центре графического окна.Инструкция turtle.forward(100) рисует прямую линию.
Метод turtle.mainloop() позволяет отлавливать события от пользователя.Например,модуль turtle поддерживает таймер и имеет возможность обнаружения щелчка мышью на графическом окне.

import turtle

sc = turtle.Screen()
sc.setup(400, 400)
 
def func_on_screen(x, y):
 turtle.setx(x)
 turtle.sety(y)
 turtle.write("Hello turtle")
turtle.onscreenclick(func_on_screen)

turtle.mainloop()

Инструкции turtle.setx(x) и turtle.sety(y) устанавливает координаты черепашки,в которых и будет производится вывод текста.

import turtle

sc = turtle.Screen()
sc.setup(400, 400)
 
def func_on_screen(x, y):
 turtle.clear()
 turtle.penup()
 turtle.goto(x,y)
 turtle.pendown()
 turtle.forward(100)
turtle.onscreenclick(func_on_screen)

turtle.mainloop()

Данный выше код позволяет рисовать прямую линию в месте щелчка мышью.Инструкция turtle.clear() очищает область рисования.Инструкция turtle.penup() - поднимает перо рисования,а turtle.pendown() его опускает для начала рисования в текущих координатах.

История создания черепашьей графики покрыта тайной и некоторые ученые пытаются приписать функциональность черепашки себе.Кто на самом деле придумал эту идею непонятно.Но для программирования черепашки это не имеет большого значения.Главное то,что мы можем использовать свободно функции модуля turtle.Официальная документация питона для модуля turtle,как я понял, не поддерживает русского языка.
Вообще черепашка может использоваться для обучения программированию.Данный модуль содержит простые команды рисования и они являются достаточно понятными инструкциями компьютеру.Конечно изучать начала программирования можно и без использования модуля turtle.
Метод turtle.forward позволяет двигать черепашку на указанное расстояние вперёд,при этом учитывается направление,turtle.backward перемещает черепашку назад.
Метод turtle.left - поворачивает черепашку налево на определенный угол,turtle.right поворачивает черепашки направо,как можно понять из названия.

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

import turtle

sc = turtle.Screen()
sc.setup(400, 400)
 
def func_on_screen(x, y):
 
 my_text = turtle.textinput("Введите слово","")
 turtle.setx(x)
 turtle.sety(y)
 turtle.clear()
 turtle.write(my_text)
turtle.onscreenclick(func_on_screen)

turtle.mainloop()

Метод turtle.textinput служит для ввода некоторого текста в программу от пользователя.Первый параметр определяет заголовок окна сообщения,второй параметр определяет описание характера вводимой информации.В данном случае описание задаётся пустой строкой и понятное дело ничего не отображается в всплывающем диалоговом окне.


import turtle

sc = turtle.Screen()
sc.setup(400, 400)
counter1 = 0
def timer_cycle():
 global counter1
 turtle.clear()
 turtle.write(counter1,font=("Arial", 16, "normal"))
 turtle.ontimer(timer_cycle,1000)
 counter1 = counter1 + 1

turtle.hideturtle()
timer_cycle()

turtle.mainloop()

Не знаю насколько правильным является данный подход в реализации простейшего таймера в модуле turtle,но по крайнем мере он работает.Для того,чтобы назначить определенный шрифт и его размер используется именованный параметр font,который представляет собой  кортеж и этот кортеж присваивается именованному параметру.

Как я понял модуль  turtle  является надстройкой модуля tkinter.Понятное дело,что модуль tkinter имеет больший функционал,чем модуль turtle.
Инструкция global counter1 позволяет обращаться к глобальной переменной и изменять её значение в функции timer_cycle().

Постепенно в этом руководстве начинают использоваться инструменты языка программирования питон.Ясное дело,что  понимание работы с модулем turtle - хороший программисткий навык.Хотя некоторые люди могут считать иначе.)))

import turtle

sc = turtle.Screen()
sc.setup(400, 400)
counter1 = 0
x1 = 0
x2 = 0
y1 = 0
def timer_cycle():
 global counter1
 global x1,x2,y1
 x1 = x1 - counter1
 y1 = y1 + counter1
 turtle.pensize(5)
 turtle.goto(x1,0)
 turtle.forward(counter1)
 
 turtle.goto(-x1,0)
 turtle.forward(counter1)
 
 counter1 = counter1 + 1
 turtle.ontimer(timer_cycle,100)

turtle.hideturtle()
timer_cycle()

turtle.mainloop()

Я хотел реализовать рисование координатной оси в черепашьей графике,но как я понял экспериментальным путём - это не такая уж и простая задача.Здесь надо понимать специфику черепашьей графики.На данный момент времени я не понимаю,как решить возникшую задачу.

Одно из возможных решений выглядит так.

import turtle
sc = turtle.Screen()
sc.setup(400, 400)
counter1 = 0
state = 1
def timer_cycle():
 global counter1,state
 counter1=counter1+5
 turtle.pensize(5)
 if state == 1:
  turtle.left(90)
  state = 2

 turtle.goto(0,0)
 turtle.forward(counter1)

 if state == 2:
  turtle.right(180)
  state = 1
 
 turtle.goto(0,0)
 turtle.forward(counter1)
 
 counter1 = counter1 + 1
 turtle.ontimer(timer_cycle,10)

turtle.hideturtle()
timer_cycle()

turtle.mainloop()


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

import turtle

sc = turtle.Screen()
sc.setup(400, 400)

turtle.forward(50)
turtle.left(90)
turtle.forward(50)
turtle.left(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)
turtle.right(90)
turtle.forward(50)

turtle.mainloop()

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


import turtle

sc = turtle.Screen()
sc.setup(400, 400)
turtle.penup()
turtle.goto(-100,100)
turtle.pendown()
turtle.forward(200)
turtle.right(90)
turtle.forward(200)
turtle.right(90)
turtle.forward(200)
turtle.right(90)
turtle.forward(200)
turtle.right(90)


turtle.mainloop()

Инструкция turtle.goto() - перемещает черепашку в абсолютные координаты.Не лишним будет знать,что координаты (0,0) в черепашьей графике соответствуют центру экрана.
Ясно видно,что в этой программке повторяются инструкции,их можно заменить на цикл.
Цикл в языке программирования питон начинается с ключевого слова - for,как и во всех других существующих языках.Но циклическая конструкция в питон имеет свою специфику.Понятное дело,что один язык программирования отличается от другого языка синтаксисом и знать синтаксис необходимо,чтобы составлять корректные программные конструкции.
Рисование квадрата не тянет на сложную программу!Но здесь я ввожу новый программистский примитив - простой явный цикл.Конечно для опытных людей - это давно известное понятие.
Рекурсивный цикл мы уже видели при применении таймера!

for i in range(0,4):
 turtle.forward(200)
 turtle.right(90)


Рисование закрашенного квадрата в модуле turtle является не таким уж простым заданием.Модуль черепашьей графики имеет свои особенности,которые нужно понимать,чтобы что-либо реализовать на нём.Программист должен осознавать,что модули включают в себя некоторые методы,но сами по себе они не решают комплексной технической задачи.


import turtle

sc = turtle.Screen()
sc.setup(400, 400)
pen = turtle.Turtle()
pen.penup()
pen.goto(-100,100)
pen.pendown()
pen.fillcolor("red")
pen.begin_fill()
for i in range(0,4):
 pen.forward(200)
 pen.right(90)
pen.end_fill()


turtle.mainloop()


Данная программка рисует ломанную линию.Чем больше пользователь задаёт координат,тем длиннее становится ломанная линия.Следующими координатами назначаются координаты мыши,считанные во время щелчка.Инструкция turtle.onscreenclick - связывает холст с кликом мыши.Выше я уже её использовал.

import turtle

sc = turtle.Screen()
sc.setup(400, 400)

def func_on_screen(x,y):
  point1 = (x, y)
  turtle.goto(point1)


turtle.onscreenclick(func_on_screen)
 
turtle.mainloop()

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

При клике мышью координаты квадрата изменяются.Инструкция global x_obj позволяет модифицировать значение,находящиеся в глобальной области видимости.
На самом деле,чтобы писать программы необходимо разбираться в области видимости.Ни одна большая программа не разрабатывается без понимания этого аспекта программирования.
Желательно кликать мышью раз в пять секунд.Иначе результат будет малозанимательный.Ясное дело,что алгоритм нужно как-то переработать.)))
import turtle

sc = turtle.Screen()
sc.setup(400, 400)
x_obj = -100
y_obj = 100
def func_on_screen(x, y):
 global x_obj
 global y_obj
 turtle.penup()
 turtle.goto(x_obj,y_obj)
 turtle.pendown()
 x_obj = x_obj + 5
 y_obj = y_obj + 5
 for i in range(0,4):
  turtle.forward(200)
  turtle.right(90)
turtle.onscreenclick(func_on_screen)


turtle.mainloop()

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


Конечно данный алгоритм не является совершенным и идеальным,но приблизительно начинает рисовать ломанную линию в месте клика мышью.У настоящей ломанной линии те отрезки,из которых она состоит никогда не пересекаются.В этой же программке лишь иногда отрезки не наслаиваются друг на друга.Здесь есть над чем работать!)))
import turtle
import random 
polygon = turtle.Turtle()
def func_on_screen(x, y):
 num_sides = 5 
 polygon.goto(x,y)
 for i in range(num_sides):
    polygon.forward(70)
    polygon.right(random.randint(50,360))
   
turtle.onscreenclick(func_on_screen)
turtle.mainloop()

В данном случае происходит рисование квадратов при щелчке мыши.В общем эта идея предельно проста.Её можно немного усложнить,добавив случайную генерацию сторон четырёхугольника.Это можно реализовать импортированием модуля random.Кстати,импортирование этого модуля и его использование я уже приводил выше.
Вообще программирование на языке питон подразумевает умение взаимодействовать со многими стандартными и нестандартными модулями.

import turtle
polygon = turtle.Turtle()
def func_on_screen(x, y):
 polygon.penup()
 polygon.goto(x,y)
 polygon.pendown()

 
 for i in range(0,4):
  polygon.forward(200)
  polygon.right(90)
   
turtle.onscreenclick(func_on_screen)
turtle.mainloop()

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

import turtle 
x1 = 0
y1 = 0
x2 = 0
y2 = 0
click = 0
def func_on_screen(x, y):
 global x1
 global y1
 global x2
 global y2
 global click
 if click == 0:
  x1 = x
  y1 = y
  print ("click 1")
  print (x1,y1)
 if click == 1:
  x2 = x
  y2 = y
  print ("click 2")
  print (x2,y2)
 
  draw_line(x1,y1,y2,x2)

 click = click + 1
 if click == 2:
  click = 0
def draw_line(x1,y1,y2,x2):
 turtle.penup()
 turtle.goto(x1,y1)
 turtle.pendown()
 turtle.goto(x2,y2)

turtle.onscreenclick(func_on_screen)
turtle.mainloop()


В этой программке реализовано рисование квадратов по горизонтали.По мере выполнения черепашка перемещается по холсту с помощью метода goto и приращивается координата x.Что проще такой идеи?)))


import turtle

sc = turtle.Screen()
sc.setup(400, 400)
x = -200
def timer_cycle():
 global x
 turtle.pensize(5)
 turtle.penup()
 turtle.goto(x,200)
 turtle.pendown()
 
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 x = x + 50
 turtle.ontimer(timer_cycle,1000)

timer_cycle()

turtle.mainloop()

Следующей программкой будет рисование сетки из квадратов.Здесь уже изменяются как x-координаты,так и y-координаты.Причем y-координата изменяется при конкретном условии.Ясное дело,что обработка условий в языке программирования питон задаётся оператором ветвления if.

import turtle

sc = turtle.Screen()
sc.setup(400, 400)
x = -200
y = 100
def timer_cycle():
 global x,y
 turtle.pensize(5)
 turtle.penup()
 turtle.goto(x,y)
 turtle.pendown()
 
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 turtle.right(90)
 turtle.forward(50)
 x = x + 50
 if x == 50:
  x = -200
  y -=50
 turtle.ontimer(timer_cycle,1000)

timer_cycle()

turtle.mainloop()


Модуль черепашьей графики поддерживает реагирование на какую-либо клавишу клавиатуры.С помощью метода onkey можно привязать к холсту функцию,которая будет выполнять некоторые определенные программные инструкции.


import turtle
sc = turtle.Screen()
sc.setup(400, 400)
turtle.colormode(255)
r = 155
g = 255
b = 255
x = -100
y = 100
def output_rect():
 global x,y
 turtle.pensize(5)
 turtle.penup()
 turtle.goto(x,y)
 turtle.pendown()

 turtle.color(r,g,b)
 
 turtle.begin_fill()
 for i in range(0,4):
   turtle.forward(200)
   turtle.right(90)
 turtle.end_fill()


turtle.listen()
turtle.onkey(output_rect, 'Return')
turtle.mainloop()
 
Чтобы нарисовать квадрат с конторами разного цвета необходимо определить псевдослучайным образом три переменные,представляющие собой способ кодирования цвета в виртуальном компьютерной среде.Каждая переменная отвечает за свой компонент цвета.
Цикл черепашки рисует последовательно сторону квадрата,но при этом  генерирует  псевдослучайные числа и далее использует их.
Обычно в компьютерной среде генератор чисел продуцирует именно псевдослучайные числа.Генератор необходимо инициализовать так называемым семенем,который в конечном итоге и определяет результирующее число. 

import turtle
import random
sc = turtle.Screen()
sc.setup(400, 400)
turtle.colormode(255)


turtle.pensize(5)
turtle.penup()
turtle.goto(-100,100)
turtle.pendown()


 
for i in range(0,4):
   r = random.randint(0,255)
   g = random.randint(0,255)
   b = random.randint(0,255)
   turtle.color(r,g,b)
   turtle.forward(200)
   turtle.right(90)

turtle.mainloop()

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

import turtle
import random
sc = turtle.Screen()
sc.setup(400, 400)
turtle.colormode(255)
turtle.pensize(5)
turtle.penup()
turtle.goto(-100,100)
turtle.pendown()

def timer_cycle():
 for i in range(0,4):
   turtle.pensize(random.randint(0,25))
   r = random.randint(0,255)
   g = random.randint(0,255)
   b = random.randint(0,255)
   turtle.color(r,g,b)
   turtle.forward(200)
   turtle.right(90)
 turtle.ontimer(timer_cycle,500)
 

turtle.hideturtle()
timer_cycle()

turtle.mainloop()

Рисование линии происходит при увеличении y-координаты.Эта идея довольно проста и у меня возникает вопрос,не реализовал ли я её уже в этом учебном материале?Не знаю насколько этот учебный материал полезен для программистов!На самом деле я пытаюсь придумать интересные идеи и их преобразовать в программный код.Вероятно,многие люди,в этой теоретической работе еще не нашли уникальных и умных разработок,которые имеют отношение к области черепашьей графики.Но в любом случае оценивать эту работу читателям!

import turtle
import random
sc = turtle.Screen()
sc.setup(400, 400)
turtle.colormode(255)

turtle.penup()
turtle.goto(-100,100)
turtle.pendown()
y = 100
def timer_cycle():
   turtle.pensize(15)
   r = random.randint(0,255)
   g = random.randint(0,255)
   b = random.randint(0,255)
   turtle.color(r,g,b)
   global y 
   y = y - 10
   turtle.penup()
   turtle.goto(-100,y)
   turtle.pendown()
   turtle.forward(200)

   turtle.ontimer(timer_cycle,500)
 

turtle.hideturtle()
timer_cycle()

turtle.mainloop()

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

import turtle
import random
sc = turtle.Screen()
sc.setup(400, 400)
turtle.colormode(255)


turtle.pensize(5)
turtle.penup()
turtle.goto(-100,100)
turtle.pendown()


 
for i in range(0,4):
  if i == 0:
   turtle.setx(-100)
   turtle.sety(100)
   turtle.circle(15)
  if i == 1:
   turtle.setx(100)
   turtle.sety(100)
   turtle.circle(15)
   
  if i == 2:
   turtle.setx(100)
   turtle.sety(-100)
   turtle.circle(15)
  if i == 3:
   turtle.setx(-100)
   turtle.sety(-100)
   turtle.circle(15)

  r = random.randint(0,255)
  g = random.randint(0,255)
  b = random.randint(0,255)
  turtle.color(r,g,b)
  turtle.forward(200)
  turtle.right(90)

turtle.mainloop()


 

Просмотров: 61 | Добавил: moskov | Рейтинг: 0.0/0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Меню сайта

Мини-чат

Статистика


Онлайн всего: 11
Гостей: 11
Пользователей: 0

Форма входа

Календарь

«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Архив записей

Друзья сайта

  • ЗОВ КОСМОСА

  • Хулиган Вселенной

  • Тюремная поэзия

  • Религиозная поэзия

  • Сайт клана ЛеГиоН
  • Поиск