# L554.py # Санкт-Петербург, Лицей № 554, июнь 2020 ''' Модуль L554.py версия от 2020-0613. Модуль представляет собой внешнюю подпрограмму выполняющую необходимые вспомогательные построения (координатная сетка, вывод на экран координат курсора по щелчку мыши и т.п.). 1. Должен находиться в папке с запускаемой программой. 2. Модуль в запускаемой программе подключается строкой from L554 import * 3. Строит координатную сетку в заданном масштабе (например: mset =50) (50 - количество пикселей на одну клетку - единицу длины); 4. Выводит по щечку лкм координаты курсора в масштабе сетки. 5. Позволяет дополнительно использовать два оператора: точки и линии, содержащих все необходимые для построения параметры (координаты, толщина, цвет). Координаты в единицах сетки (1 клетка = 1 единице в графических операторах) 6. В основной программе исполняемые операторы размещены между строками комментариев 123 ... 321: Это значительно упрощает все графические построения и отладку программы. Учащимся достаточно знать понятия стандартной координатной системы и синтаксис двух новых операторов (точки и линии:m_pset и m_line). Учитель точно знает, где искать ошибку обучающегося (только между строками комментариев 123 ... 321. При использовании модуля все стандартные операторы работают штатно. Для проверки работоспособности модуль может быть запущен как самостоятельная программа - должно появиться построение наклонной плоскости. При первом запуске файла L554.py как модуля (т.е. вызовом из основной программы (командой:from L554 import *) создается папка __pycache__ содержащая компилированный файл L554.cpython-32.pyc Это компилированный файл модуля. Его стоит переименовать в L554.pyc (т.е. питоновский, компилированный). и сохранить в папку с программой (вместо L554.py, тогда папку __pycache__ тоже можно удалить). Т.е. в папке с основной программой будет всего два файла: файл программы и компилированный файл модуля. Строка вызова модуля from L554 import * не меняется, но использование компилированного файла предохранит сам модуль от нежелательных изменений (как случайных, так и просто из любопытства). Можно будет сосредоточиться на отладке основной программы, которая при импортировании модуля L554.py получится короче за счет использования одного нового графического оператора (точки, линии) вместо трех и отсутствия подпрограмм построения координатной сетки и др. в самой программе. С первых шагов можно строить значительно более сложные программы при значительно меньшем количестве операторов. При этом все стандартные операторы python 3 работают как обычно. Обновленную версию и разные программы, работающие с ним, можно получить на сайте turtk.viptop.ru Желаем успешной работы! ''' # Модуль L554.py версия от 2020-0605. # # import turtle as t import turtle from turtle import * from math import * from tkinter import * # модуль для получения значений ws и hs ширины и высоты экрана root = Tk() global ws,hs # Получение размера экрана пользователя ScrW = root.winfo_screenwidth() # Получение ширины экрана ws = ScrW - 10 ScrH = root.winfo_screenheight() # Получение высоты экрана hs = ScrH - 70 root.destroy() #==================================================== import turtle as t t.hideturtle() #print('ws = ',ws) #print('hs = ',hs) t1=Turtle() t1.hideturtle() wt=t.Screen() wt.bgcolor('#ffffe0') wt.tracer(10) # Скорость 1-10. При 0 - рисует мгновенно. # Информация для титульной строки #turtle.title ('Рисуем линии двумя курсорами. СПБ Лицей 554') wt.title (' СПБ Лицей 554') # Задаем удобные размеры экрана wt.setup (ws, hs, 0, 0) # Перемещаем перо t.penup(); t.goto ((-ws/2+76), (hs/2-20)) # Задаем цвет t.color ('navy') # Этикетка t.write ('Санкт-Петербург, Лицей №554', font = 'Helvetica 7 bold') t.penup(); t.goto (0, 0) t.hideturtle() ''' t.write ('Санкт-Петербург, Лицей №554', font = ('Times New Roman', 12, 'bold')) t.penup(); t.goto (0, 0) t.hideturtle() label = Label(text='Санкт-Петербург, Лицей №554', font='Helvetica 7 bold',background='#ffffef') #label.pack(fill=Y, expand=1) label.place(x=76,y=10) ''' def pset(t12,px,py,pw,pc): t12.hideturtle() t12.up() t12.width(pw) t12.setx(px) t12.sety(py) t12.down() #t12.dot(pw,pc) t12.dot(pw,pc) t12.up() #=================================================== def line(lt,lx1,ly1,lx2,ly2,lw,lc): lt.hideturtle() lt.width(lw) lt.color(lc) lt.up() # подняли перо lt.goto(lx1,ly1) lt.down() lt.goto(lx2,ly2) # провели линию lt.up() # подняли перо #=================================================== def krug(t1,kx,ky,kr,kc): #t1.speed(0) r = kr x0 = kx y0 = ky for fi in range (0,360): x = x0 + r *cos(fi*3.14/180) y = y0 + r * sin(fi*3.14/180) t1.up() t1.goto(x,y) t1.down() t1.dot(5,kc) #=================================================== global mset def msetout(mset): global mset2 mset2=mset pset(turtle,0,0,7,'green') # точка в начале координат turtle.hideturtle() def coor(x,y): global mset2 t.hideturtle() t.speed(0) t.width(1) t.clear() t.up() t.goto(-230,0) t.down() t.goto(230,0) t.up() t.goto(0,230) t.down() t.goto(0,-230) t.up() # Вычисляем радиус окруж с центр 0,0 # проходящей через точку с коор х,у r = sqrt(x*x + y*y) t.goto(x,y) t.color('#ffffe0') #t.down() t.goto(0,0) t.goto(x,0) t.goto(x,y) t.color('black') t.write('x=%7.2f | y=%7.2f' % (turtle.xcor()/mset2, turtle.ycor()/mset2), move=False, align="left", font=("Arial", 18, "normal")) t.dot(7,'red') t.up() t.goto(0,-r) #t.circle(r) # проводим окружность t.up() sinus = y/r cosinus = x/r k = ((asin(y/r)) *(180/3.14)) if y/r > 0 and x/r > 0:print('a = % 5.1f ' % k) if y/r > 0 and x/r < 0:print('a = % 5.1f ' % (180 - abs(k))) if y/r < 0 and x/r < 0:print('a = % 5.1f ' % (180 + abs(k))) if y/r < 0 and x/r > 0:print('a = % 5.1f ' % (360 - abs(k))) print('sin(a) = % 5.2f ' % sinus) print('cos(a) = % 5.2f ' % cosinus) print() print('-------------------------') print() #=================================================== #=================================================== def setka(mset): ts=Turtle() ts.hideturtle() x=0 while x < ws: x=x+mset y1=hs/2 y2=-hs/2 line(t1,x,y1,x,y2,2,'lightblue') x=mset while x > -ws: x=x-mset y1=hs/2 y2=-hs/2 line(t1,x,y1,x,y2,2,'lightblue') # y=0 while y < hs: y=y+mset x1=ws/2 x2=-ws/2 line(t1,x1,y,x2,y,2,'lightblue') y=mset while y > -hs: y=y-mset x1=ws/2 x2=-ws/2 line(t1,x1,y,x2,y,2,'lightblue') # оси ts.speed(0) ts.width(1) ts.color('black') #ts.clear() ts.up() ts.goto(-500,0) ts.down() ts.goto(500,0) ts.up() ts.goto(0,230) ts.down() ts.goto(0,-230) ts.up() ts.hideturtle() #=================================================== def m_line(mset,tl,x1,y1,x2,y2,lw,lc): line(tl,x1*mset,y1*mset,x2*mset,y2*mset,lw,lc) def m_pset(mset,t,px,py,pw,pc): x=px*mset y=py*mset pset(t,x,y,pw,pc) def m_krug(mset,tk,kx,ky,kr,kc): kx=kx*mset krug(tk,kx,ky*mset,kr*mset,kc) if __name__ == "__main__": # Вызов стандартных модулей и модуля L554 from L554 import * import turtle as t import turtle from turtle import * from math import * label = Label(text=' ТЕСТ МОДУЛЯ L554 \n' ' версия от 2020-0613 \n ' 'модуль выполняется как основная программа.', font='Arial 20 bold',background='#ffffdd') label.place(x=270,y=13) t.hideturtle() t1=Turtle() t1.hideturtle() turtle.hideturtle() global x, y,mset x=t1.xcor() y=t1.ycor() mset =100 # Сколько точек на 1 деление сетки координат setka(mset) # Построение сетки в заданном масштабе msetout(mset) t.onscreenclick(coor) # Вычисление координат # Эти операторы строят немасштабируемые объекты line(t1,-ws/2+10,hs/2-30,-ws/2+50,hs/2-30,50,'yellow') line(t1,-ws/2+10,hs/2-20,-ws/2+50,hs/2-20,10,'white') line(t1,-ws/2+10,hs/2-30,-ws/2+50,hs/2-30,10,'blue') line(t1,-ws/2+10,hs/2-40,-ws/2+50,hs/2-40,10,'red') m_line(mset,t1,-2,-2,4,-2,25,'yellow') # Основание наклонной плоскости m_line(mset,t1,4,1,4,-2,25,'green') # Вертикальная линия m_line(mset,t1,4,1,-2,-2,25,'purple') # Наклонная линия m_pset(mset,t1,4,1,10,'black') # Ось шкива m_pset(mset,t1,4,-2,10,'brown') # Гвоздик m_pset(mset,t1,-2,-2,10,'black') # Гвоздик m_pset(mset,t1,-1,-1.17,35,'red') # Колесо m_pset(mset,t1,-1,-1.17,5,'black') # Ось колеса m_pset(mset,t1,0,-0.67,35,'red') # Колесо m_pset(mset,t1,0,-0.67,5,'black') # Ось колеса m_line(mset,t1,-1.25,-0.84,-0.15,-0.3,50,'brown') # Корпус тележки #m_krug(mset,t1,6, 3,0.2,'blue') # Стрелка вектора скорости m_line(mset,t1,0.07,-0.19,1.96,0.7,5,'blue') # m_line(mset,t1,1.69,0.68,1.96,0.7,5,'blue') # m_line(mset,t1,1.78,0.52,1.96,0.7,5,'blue') # m_line(mset,t1,2.0,0.72,3.68,1.47,3,'#aaaaaa') # трос вдоль плоскости m_pset(mset,t1,4,1,120,'red') # шкив max m_pset(mset,t1,4,1,111,'brown') # шкив mid m_pset(mset,t1,4,1,10,'black') # Ось шкива m_line(mset,t1,4.57,0.8,4.57,-0.2,3,'#aaaaaa') # трос вниз к грузу m_line(mset,t1,4.57,-0.6,4.57,-1.2,75,'#554554') # груз m_pset(mset,t1,4.57,-0.21,13,'#554554') # крепление груза m_pset(mset,t1,4.57,-0.21,5,'#ffffff') # отверствие для крепления груза # крепление троса к тележке m_pset(mset,t1,0.06,-0.2,11,'brown') # m_pset(mset,t1,0.06,-0.2,4,'white') # mainloop()