直播源码网站,点击图片可进行任意方向旋转功能
直播源码网站,点击图片可进行任意方向旋转功能实现的相关代码
一、使用PIL库
在Python中, 实现turtle的图片旋转需要使用PIL库, 该库可通过pip安装。
使用PIL的Image.open函数可以实现加载图片; 使用ImageTk.PhotoImage可将PIL.Image对象转换为tkinter使用的类型。
PIL与tkinter实现的显示图片的程序如下:
1 | <br>from tkinter import *<br>from PIL import Image,ImageTk<br>root=Tk()<br>cv=Canvas(root,bg= 'black' )<br>cv.pack(side=TOP,expand=True,fill=BOTH)<br>image=Image.open( "bh.png" , "r" )<br>image=image.resize((100,100))<br>imtk=ImageTk.PhotoImage(image)<br>id=cv.create_image(100,100,image=imtk)<br>cv.after(20,animate)<br>root.mainloop() |
二、实现图片旋转
打开冗长的turtle模块的源代码, (读了半天)找到了TurtleScreenBase类, 该类用于底层的绘制图形等操作。程序的关键是使用自定义的函数替换turtle模块中原有的函数。
完整代码如下:
1 | <br>from turtle import *<br>from turtle import TurtleScreenBase<br> try :<br> from PIL import Image,ImageTk<br>except ImportError:<br> Image=None<br>images={}<br># 使用自定义的函数替换turtle模块中原有的函数<br>def _image(self,filename):<br> img=Image.open(filename)<br> im = ImageTk.PhotoImage(img)<br> im.raw = img<br> im.zoomcache = [None,None]<br> return im<br>def _createimage(self, image):<br> "Create and return image item on canvas." <br> id = self.cv.create_image(0, 0, image=image)<br> return id<br>def _drawimage(self, item, pos, image, angle=None,zoom=None):<br> "Configure image item as to draw image object at position (x,y) on canvas)" <br> w=self.window_width();h=self.window_height()<br> if not (-h //2 < pos[1] < h//2\<br> and -w//2 <= -pos[0] < w//2):<br> self.cv.itemconfig(item, image=self._blankimage()) # 清除图像<br> return<br> prev=image<br> if zoom:<br> # zoomcache为列表, 格式为[<放大倍数>, <图像>], 用于储存图像放大后的副本<br> if zoom == image.zoomcache[0]:<br> image=image.zoomcache[1]<br> else:<br> raw=image.raw<br> size=(int(raw.size[0] * zoom), int(raw.size[1] * zoom))<br> raw = raw.resize(size,resample=Image.BILINEAR)<br> image=ImageTk.PhotoImage(raw)<br> image.raw=raw<br> prev.zoomcache=[zoom,image]<br> if angle is not None:<br> <br> raw=image.raw<br> image=ImageTk.PhotoImage(raw.rotate(angle))<br> image.raw=raw<br> <br> images[item]=image # 创建 img 的引用, 防止img消失<br> x, y = pos<br> self.cv.coords(item, (x * self.xscale, -y * self.yscale))<br> self.cv.itemconfig(item, image=image)<br>def register_shape(self, name, shape=None):<br> if shape is None:<br> if name.lower()[-3:] in (".gif","jpg","bmp","png"):<br> shape = Shape("image", self._image(name))<br> else:<br> raise TurtleGraphicsError("Bad arguments for register_shape.\n"<br> + "Use help(register_shape)" )<br> # 从turtle模块复制的部分<br> elif isinstance(shape, tuple):<br> shape = Shape("polygon", shape)<br> ## else shape assumed to be Shape-instance<br> self._shapes[name] = shape<br># turtle的_drawturtle方法, 当Turtle的形状将要绘制时调用<br>def _drawturtle(self):<br> """Manages the correct rendering of the turtle with respect to<br> its shape, resizemode, stretch and tilt etc."""<br> # 从turtle模块复制的部分<br> screen = self.screen<br> shape = screen._shapes[self.turtle.shapeIndex]<br> ttype = shape._type<br> titem = self.turtle._item<br> if self._shown and screen._updatecounter == 0 and screen._tracing > 0:<br> self._hidden_from_screen = False<br> tshape = shape._data<br> if ttype == "polygon":<br> if self._resizemode == "noresize": w = 1<br> elif self._resizemode == "auto": w = self._pensize<br> else: w =self._outlinewidth<br> shape = self._polytrafo(self._getshapepoly(tshape))<br> fc, oc = self._fillcolor, self._pencolor<br> screen._drawpoly(titem, shape, fill=fc, outline=oc,<br> width=w, top=True)<br> elif ttype == "image":<br> # 形状为图像时<br> screen._drawimage(titem, self._position, tshape,<br> self.heading(),self._stretchfactor[0])<br> elif ttype == "compound":<br> for item, (poly, fc, oc) in zip(titem, tshape):<br> poly = self._polytrafo(self._getshapepoly(poly, True))<br> screen._drawpoly(item, poly, fill=self._cc(fc),<br> outline=self._cc(oc), width=self._outlinewidth, top=True)<br> else:<br> if self._hidden_from_screen:<br> return<br> if ttype == "polygon":<br> screen._drawpoly(titem, ((0, 0), (0, 0), (0, 0)), "", "")<br> elif ttype == "image":<br> screen._drawimage(titem, self._position,<br> screen._shapes["blank"]._data)<br> elif ttype == "compound":<br> for item in titem:<br> screen._drawpoly(item, ((0, 0), (0, 0), (0, 0)), "", "")<br> self._hidden_from_screen = True<br>if Image:<br> TurtleScreenBase._image=_image<br> TurtleScreenBase._createimage=_createimage<br> TurtleScreenBase._drawimage=_drawimage<br> TurtleScreen.register_shape=register_shape<br> RawTurtle._drawturtle=_drawturtle<br>scr=getscreen()<br>scr.register_shape('blackhole.jpg')<br>shape('blackhole.jpg')<br>while True:<br> forward(60)<br> left(72)<br>done() |
以上就是 直播源码网站,点击图片可进行任意方向旋转功能实现的相关代码,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现