мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
python:week15 [04/05/2017 03:25] – [Работа с цветами] ybezrukovpython:week15 [16/03/2018 11:39] (текущий) – [Сегмент] ybezrukov
Строка 71: Строка 71:
   * ''getKey()'' - приостанавливает выполнение программы и ожидает пока нажмут кнопку на клавиатуре. Возвращает строчку, в которой хранится нажатая клавиша. Например: keyString = win.getKey()   * ''getKey()'' - приостанавливает выполнение программы и ожидает пока нажмут кнопку на клавиатуре. Возвращает строчку, в которой хранится нажатая клавиша. Например: keyString = win.getKey()
   * ''checkKey()''- аналогично checkMouse, но для клавиатуры. В отличие от checkMouse, если клавиша нажата не была, то возвращает пустую строку.   * ''checkKey()''- аналогично checkMouse, но для клавиатуры. В отличие от checkMouse, если клавиша нажата не была, то возвращает пустую строку.
 +  * ''getWidth()'' - возвращает значение ширины графического окна в пикселях 
 +  * ''getHeight()'' - возвращает значение высоты графического окна в пикселях
 ====== Графические элементы ====== ====== Графические элементы ======
  
Строка 114: Строка 115:
   * ''getP1(), getP2()'' - возвращает соответственно, координаты левого нижнего и правого верхнего углов прямоугольника, в который вписан овал.   * ''getP1(), getP2()'' - возвращает соответственно, координаты левого нижнего и правого верхнего углов прямоугольника, в который вписан овал.
  
 +
 +===== Сегмент =====
 +
 +К сожалению, библиотека не содержит в себе встроенной функции для отрисовки сегмента окружности или овала. Однако, это питон и никто не мешает нам дописать необходимую функциональность.
 +
 +Добавим в начало программы следующий код:
 +
 +<code python>
 +class Arc(Oval):        
 +    
 +    def __init__(self, p1, p2,start, extent):
 +        self.extent = extent
 +        self.start = start
 +        super().__init__(p1, p2)
 +
 +    def __repr__(self):
 +        return "Arc({}, {}, {})".format(str(self.p1), str(self.p2), self.extent)
 +
 +    def clone(self):
 +        other = Arc(self.p1, self.p2, self.start, self.extent)
 +        other.config = self.config.copy()
 +        return other
 +
 +    def _draw(self, canvas, options):
 +        p1 = self.p1
 +        p2 = self.p2
 +        x1, y1 = canvas.toScreen(p1.x, p1.y)
 +        x2, y2 = canvas.toScreen(p2.x, p2.y)
 +        options['style'] = tk.PIESLICE
 +        options['extent'] = self.extent
 +        options['start'] = self.start
 +        return canvas.create_arc(x1, y1, x2, y2, options)
 +</code>
 +
 +Теперь в нашей программе появилась возможность рисовать сегменты окружности, например:
 +
 +<code python>
 +arc = Arc(Point(50, 50), Point(100, 100), 45, 270)
 +arc.setFill("yellow")
 +arc.draw(win)
 +</code>
 +
 +  * Arc(point1, point2, start_angle, segemnt_angle) - создает сегмент овала, который вписан в прямоугольник с заданными левым нижним и правым верхним углами. start_angle - начальный угол с которого начинает рисоваться сегмент, segment_angle - угол закрашенного участка.
 +  * getCenter() - возвращает координаты центра овала.
 +  * getP1(), getP2() - возвращает соответственно, координаты левого нижнего и правого верхнего углов прямоугольника, в который вписан овал.
 ===== Многоугольник ===== ===== Многоугольник =====
   * ''Polygon(point1, point2, point3, ...)'' - создает замкнутый многоугольник по заданному набору вершин. В качестве аргумента может быть и список. Например: ''aPolygon = Polygon(Point(1,2), Point(3,4), Point(5,6))'' или ''aPolygon = Polygon([Point(1,2), Point(3,4), Point(5,6)])''   * ''Polygon(point1, point2, point3, ...)'' - создает замкнутый многоугольник по заданному набору вершин. В качестве аргумента может быть и список. Например: ''aPolygon = Polygon(Point(1,2), Point(3,4), Point(5,6))'' или ''aPolygon = Polygon([Point(1,2), Point(3,4), Point(5,6)])''
Строка 127: Строка 173:
   * ''setStyle(style)'' - задает стиль шрифта. Возможные значения параметра: "normal", "bold", "italic", "bold italic".   * ''setStyle(style)'' - задает стиль шрифта. Возможные значения параметра: "normal", "bold", "italic", "bold italic".
   * ''setTextColor(color)'' - Задает цвет текста   * ''setTextColor(color)'' - Задает цвет текста
-==== Работа с цветами ====+ 
 +===== Обновление экрана ===== 
 + 
 +По умолчанию, библиотека graphics.py обновляет экран при отрисовке каждого элемента. Обновление экрана операция дорогая по времени, поэтому иногда (например, когда на экране мнго объектов) нужно эту функцию автообновления отключить. 
 + 
 +Для этого: 
 +1. При инициализации графического окна нужно добавить параметр ''autoflush=False''.  
 +2. В цикле отрисовки нужно добавить явный вызов функции обновления окна, указав в качестве аргумента частоту кадров, с которой следует обновлять окно 
 + 
 +<code python> 
 +win = GraphWin("Update Example", 320, 200, autoflush=False) 
 +for i in range(1000): 
 +    # <Все что рисуется на экране> 
 +    update(30) 
 +</code>     
 + 
 +===== Работа с цветами =====
  
 В этой библиотеке цвет можно описать двумя способами: текстовым значением и прямым указанием цветовых компонент. В первом случае, цвет задается своим названием, например "red". Помимо этого, есть определенный выбор оттенков, например "red1", "red2","red3", "red4". По мере увеличения номера, оттенок становится более темным. На картинке перечислены все возможные значения цветов: В этой библиотеке цвет можно описать двумя способами: текстовым значением и прямым указанием цветовых компонент. В первом случае, цвет задается своим названием, например "red". Помимо этого, есть определенный выбор оттенков, например "red1", "red2","red3", "red4". По мере увеличения номера, оттенок становится более темным. На картинке перечислены все возможные значения цветов:
Строка 136: Строка 198:
  
  
 +===== Задачи =====
 ==== Задание 18 ==== ==== Задание 18 ====
  
-Воспроизвести на Питоне программу с вращающейся пирамидкой из прошлого семестра+Написать программу, которая рисует на экране точки, расположенные на окружности. Координаты точек требуется вычислять в полярной системе координат. 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=656 
 + 
 +==== Задание 19 ==== 
 + 
 +Модифицировать предыдущую программу так, чтобы точки располагались по спирали 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=657 
 + 
 +==== Задание 20 ==== 
 + 
 +Модифицировать прогрмму из задания 18 так, чтобы: 
 + 
 +  - Вместо точек рисовались окружности 
 +  - Когда рисуется следующая окружность, предыдущая должна удаляться 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=658 
 + 
 +==== Задание 21 (планеты со спутниками) ==== 
 + 
 +Добавить еще одну точку для вращения, которая будет двигаться вместе с окружностью. Запустить вокруг нее еще одну окружность. В центре разместить Солнце 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=659 
 + 
 +==== Задание 22 ==== 
 + 
 +Написать программу, в которой N точек двигались бы по одной окружности 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=660 
 + 
 +==== Задание 23 ==== 
 + 
 +Модифицировать программу так, чтобы точки были соединены линиями 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=661 
 + 
 +==== Задание 24 ==== 
 + 
 +Модифицировать предыдущую программу так, чтобы вышла иллюзия вращающейся пирамидки 
 + 
 +https://nsunc.com/moodle/mod/assign/view.php?id=662