支持旋转图像角色的海龟模块。

Python海龟宝典含200多个原创的用turtle模块制作的创意程序,原名《Python趣味编程200例》。准备参加全国创意编程与智能设计大赛的同学们可以用来做参考。

"""
   turtler.py
   支持旋转角色的海龟模块。
   本个模块重定义了原生海龟类的_rotate,__init__和shape方法
   使用pillow模块支持图形角色旋转,并且支持直接设定图片为角色的造型。
   本模块尚不支持用addshape或register_shape注册造型到型字典!
"""

__author__ = '李兴球'
__blog__ = 'www.lixingqiu.com'
__date__ = '2020/9/7'
__version__ = 0.1

import os
from PIL import Image,ImageTk
from turtle import Tbuffer,_Screen,_CFG,TNavigator,TPen,_TurtleImage,RawTurtle,Turtle,Screen,Shape

Sprite = Turtle

def _place_to_shapes(self,imagefilename):
    """用pillow模块打开图像文件,形成造型,放到造型字典中,返回在造型字典中的key"""
    self._imagename = imagefilename            # 保留原始图像文件名
    self._rawim = Image.open(imagefilename)    # 用pillow模块打开这个文件
    self._rawim = self._rawim.convert('RGBA')
    angle = self.heading()
    im = self._rawim.rotate(angle,expand=1)
    sp = Shape('image',ImageTk.PhotoImage(im))
    shapename = self._imagename + "_" + str(angle)
    self.screen.addshape(shapename,sp)
    return shapename

RawTurtle._place_to_shapes = _place_to_shapes

def __init__(self, canvas=None,shape=_CFG["shape"],
             undobuffersize=_CFG["undobuffersize"],
             visible=_CFG["visible"]):
    if isinstance(canvas, _Screen):
        self.screen = canvas
    elif isinstance(canvas, TurtleScreen):
        if canvas not in RawTurtle.screens:
            RawTurtle.screens.append(canvas)
        self.screen = canvas
    elif isinstance(canvas, (ScrolledCanvas, Canvas)):
        for screen in RawTurtle.screens:
            if screen.cv == canvas:
                self.screen = screen
                break
        else:
            self.screen = TurtleScreen(canvas)
            RawTurtle.screens.append(self.screen)
    else:
        raise TurtleGraphicsError("bad canvas argument %s" % canvas)

    screen = self.screen
    TNavigator.__init__(self, screen.mode())
    TPen.__init__(self)
    screen._turtles.append(self)
    self.drawingLineItem = screen._createline()

    if os.path.isfile(shape):                # 如果是文件
        shape = self._place_to_shapes(shape) # 第一次放到造型字典中       
    else:
        self._imagename = None              # 图片造型属性
        self._rawim = None
        
    self.turtle = _TurtleImage(screen, shape)
    self._poly = None
    self._creatingPoly = False
    self._fillitem = self._fillpath = None
    self._shown = visible
    self._hidden_from_screen = False
    self.currentLineItem = screen._createline()
    self.currentLine = [self._position]
    self.items = [self.currentLineItem]
    self.stampItems = []
    self._undobuffersize = undobuffersize
    self.undobuffer = Tbuffer(undobuffersize)
    self._update()
    
RawTurtle.__init__ = __init__

def _rotate(self, angle):
    """Turns pen clockwise by angle.
    """
    if self.undobuffer:
        self.undobuffer.push(("rot", angle, self._degreesPerAU))
    angle *= self._degreesPerAU
    neworient = self._orient.rotate(angle)
    tracing = self.screen._tracing
    if tracing == 1 and self._speed > 0:
        anglevel = 3.0 * self._speed
        steps = 1 + int(abs(angle)/anglevel)
        delta = 1.0*angle/steps
        for _ in range(steps):
            self._orient = self._orient.rotate(delta)
            self._update()
    self._orient = neworient
    
    angle = self.heading()
    shapename = self._imagename + "_" + str(angle)
    if shapename not in self.screen.getshapes():
        im = self._rawim.rotate(angle,expand=1)
        sp = Shape('image',ImageTk.PhotoImage(im))        
        self.screen.addshape(shapename,sp)
    self.shape(shapename)        
    self._update()
    
RawTurtle._rotate = _rotate

def _shape(self, name=None):
    """设定海龟的造型,用给定的文件名或造型名称"""
    if name is None:
        return self.turtle.shapeIndex
    if not name in self.screen.getshapes():
        shape = name
        if os.path.isfile(shape):           # 如果是文件        
            shapename = self._place_to_shapes(shape)                
            self.turtle._setshape(shapename)
        else:
            raise TurtleGraphicsError("There is no shape named %s" % name)
    else:
        self.turtle._setshape(name)
    self._update()
RawTurtle.shape = _shape

if __name__ == '__main__':
        
    from time import sleep
    images = [f"cats/{i}.png" for i in range(16)]

    cat = Sprite()
    cat2 = Sprite()
    i = 0
    while True:
        cat.shape(images[i])
        cat2.shape(images[i])
        i = i + 1
        i = i % 16
        sleep(0.1)
        cat.left(1)
        cat2.right(1)
本站所有作品,教程等皆为原创,版权所有。只供个人及单位内部研究使用,对外展示或传播必需经本站同意,且注明来自本站。培训机构等用本站资源培训学生,需经本站授权。一旦付款,表示同意本站知识付费原则:数字商品,不支持退款。亦可直接向微信号scratch8付款购买。入住QQ群:225792826 和爱好者共同交流,并且能下载免费提供的Python资源(需提供真实姓名才可入群)
李兴球的博客_Python创意编程技术前沿_pygame » 支持旋转图像角色的海龟模块。

李兴球Python微信公众号文章列表

Python游戏海龟模块教程说明书与案例若干免费发放

爱的纪念_Python创意情景动画源代码解析

少儿Python编程到底学些什么?这些代码或许回答了问题.

Python编程家长会花絮_萍乡中小学Python家长会现场

火星路上等着你_少儿从小学什么最好呢?

国家大力整顿教育培训机构,Scratch或Python少儿编程还有得教吗?

鸿蒙系统支持Python开发_可视化编程特别兴趣小组

Scratch作品转Python作品_小猴接桃

python海龟数据可视化。第七次全国人口普查历年数据图表

你的孩子Python编程学到哪个阶段了?给孩子报编程的家长,务必仔细一读。

五一神女来对话,看看她们聊什么?赠Python教案等。

五一快乐有大礼,告诉大家我是如何上Python课的。

Python名堂多,趣味到处有,劈开机械手,帧帧是图片。速算达人之猫狮大战正在进行。 逐字动画不独享,自动生成皆有它。2行代码自动生成字幕gif动画。 Python之潮来临,我在安源区教师科技创新能力的Python讲座

小心你的Python程序,它会是你的一面镜子。小方块闯迷宫.py源代码简析。送Scratch算法集。?

铃儿响钉铛_音效怎能忘_Python配音之Pygame混音器

人面桃花相映红_winsound模块简介

《Python昨晚我想你了》_开源的游戏海龟模块实例案例浅析

《八猫联动初体验》_来自游戏海龟模块的问候

喜爱春天的人儿啊 心地纯洁的人_Python逐行像素显示

旋转之三叶炫彩扇_蟒蛇与海龟的表演

彩虹欢迎字幕_三模合体滚图形

《Python海龟宝典》简介

100%错误的算法还在用,明明没有错别字,说我有11个错别字

奇怪的Python代码,谁能帮我解释一下??

人造地球系统让人类文明充满整个宇宙之Python32768版

深夜,是什么把你的大脑搞成一团浆糊!再谈少儿编程!

5线城市萍乡的少儿Python寒假班学的是什么内容?

关于纯少儿编程课程进化的自然选择

Python海龟画图经典作品_国庆中秋双重喜庆源代码免费下载

海龟为什么要自杀!turtle制作游戏秘籍之一

朋友,你是否知道我在仰望着你_Python神笔马良案例集

酷酷的爆炸效果_Python海龟画图不仅仅是画图

虫子满屏爬_三bug多线程示例程序浅析 少儿Python视频课程A级简介

给的gif图片加文字水印_拆帧与合帧(免费下载180个Python创意源码

用Python制作酷炫图形之如意金箍棒_颜色增加模块应用

简单的用Python做酷炫图形与动画

sb3转exe,sb3素材提取器,编程小子apk, 未公开的pygame游戏集/scratch/python少儿编程免费下载集合

夜幕下的霓虹

学本领,探索更大的世界!

李兴球博客 风火轮编程主页
error: Content is protected !!