# tkinter - 项目实战'''- 项目分析 - 屏保可以自己启动,也可以手动启动. - 一旦敲击键盘或者移动鼠标,或者引发事件,则停止. - 如果屏保是一幅画的话,则没有画框. - 图像的动作是随机的,具有随机性.(包括颜色,大小,运动方向,变形) - 整个世界的构成是 - ScreenSaver - 需要一个canvas. 大小等于屏幕大小,没有边框. - Ball - 包括颜色,变形 => 随机 - 球能动,可以被调用.'''import tkinter as tkimport randomclass RandomBall: ''' 定义一个运动球的类 ''' def __init__(self,canvas,scrnWIDth,scrnHeight): ''' canvas:画布,所有的内容都应该在画布上呈现出来.此处通过此变量传入 scrnWIDth/scrnheigh:屏幕宽高 ''' self.canvas = canvas # 这个是自己添加的.添加原因是下方代码并没有 self.canvas # 球出现的初始位置要随机.此位置表示圆心 # xpos表示位置的x坐标 self.xops = random.randint(10,int(scrnWIDth)-20) # ypos表示位置y的坐标 self.yops = random.randint(10,int(scrnHeight)-20) # 定义球运动的速度 => 模拟运动: 动画的逻辑就是重绘 =>模拟运动,不断的擦掉旧事物,重新绘制新事物 self.xveLocity = random.randint(4,20) self.yveLocity = random.randint(4,20) # 定义屏幕的宽度和高度 self.scrnWIDth = scrnWIDth self.scrnHeight = scrnHeight # 球的大小随机. # 此处球的大小用半径表示 self.radius = random.randint(20,80) # 定义颜色 # RGB表示法:三个数字,每个数字的值是0-255之间,表示RGB c = lambda:random.randint(0,255) self.color = '#%02x%02x%02x'%(c(),c(),c()) # 这个地方存疑 def create_ball(self):#定义一个函数 ''' 用构造函数定义的变量值,在canvas上画一个球 ''' # tkinter没有画圆形的函数 # 只有一个画椭圆函数,画椭圆需要定义两个坐标 # 在一个长方形内画椭圆,我们只需要定义长方形左上角和右下角就好 => 如果是一个正方形,那么椭圆就是圆 # 求两个坐标的方法是 (圆心 - 半径) x1 = self.xops - self.radius y1 = self.yops - self.radius # 椭圆的左上角 x2 = self.xops + self.radius y2 = self.yops + self.radius # 椭圆的右下角 self.item = self.canvas.create_oval(x1,y1,x2,y2,fill=self.color,outline=self.color) # 绘制椭圆 def move_ball(self): # 移动球的时候,控制球的方向 # 每次移动后,球都有一个新的坐标 self.xops += self.xveLocity self.yops += self.yveLocity # 以下判断是否会撞墙 => 撞墙的算法判断 if self.xops +self.radius>=self.scrnWIDth: #撞到右边的墙了 self.xveLocity*=-1 elif self.xops+self.radius<=0: self.xveLocity*=-1 if self.yops + self.radius >=self.scrnHeight: self.yveLocity*=-1 elif self.yops +self.radius <= 0: self.yveLocity *=-1 # 在画布上移动动画 self.canvas.move(self.item,self.xveLocity,self.yveLocity)class ScreenSaver: ''' 定义屏保的类 可以被启动 ''' # 如何装随机产生的球 balls = List() def __init__(self): self.num_balls = random.randint(6,20) self.root = tk.Tk() # 取消边框 self.root.overrIDeredirect(1) # 任何鼠标移动都要取消 self.root.bind('<Motion>',self.myquit) # 同理,安东任何键盘都需要退出屏保 # 得到 屏幕大小规格 w,h = self.root.winfo_screenwIDth(),self.root.winfo_screenheight() self.canvas = tk.Canvas(self.root,wIDth=w,height=h) # 画布的归属,规格 self.canvas.pack() # 布局 # 在画布上画球 for i in range(self.num_balls): ball = RandomBall(self.canvas,scrnWIDth=w,scrnHeight=h) ball.create_ball() self.balls.append(ball) self.run_screen_saver() self.root.mainloop() # 启动消息循环 def run_screen_saver(self): for ball in self.balls: ball.move_ball() # 系统函数 /after是200毫秒后启动一个函数,需要启动的函数是第二个参数 self.canvas.after(20,self.run_screen_saver) def myquit(self,e): # 此处只是利用了事件处理机制 # 实际上并不关心事件的类型 # 作业: # 此屏保程序扩展成,一旦捕获事件,则判断屏保不退出 # 显示一个button,Button上显示事件类型,点击Button后屏保 # 才退出 self.root.destroy() if __name__ == "__main__": ScreenSaver()总结
以上是内存溢出为你收集整理的python使用tkiner创建一个小球滚动的代码全部内容,希望文章能够帮你解决python使用tkiner创建一个小球滚动的代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)