可移动的通电棒棒

"""
   可移动的通电棒棒
   这是用小海龟画了一个漂亮的图形后让它从左到右移动了,
   移动图形有很多种方法,这里又是区别于以前的一种新方法
"""
import time
import turtle

screen = turtle.getscreen()
screen.bgcolor('black')
screen.colormode(255)
screen.title('可移动的通电棒棒')
screen.delay(0)
 
turtle.speed(0)
turtle.penup()
turtle.bk(300)
turtle.ht()
turtle.pendown()

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, turtle | 可移动的通电棒棒已关闭评论

write命令教学档案

"""
   write命令教学档案
   首先,角色所在的区为displayframe,它是一个tkinter框架或者就是tk窗口(不分区时)。
   在sprites版本v1.19中,在新建屏幕的时候可以加布局参数。
   参数的名称叫layout,如果用Screen新建屏幕不写参数或值为1,那么一切还是海龟画图那样的布局。
   如果加了参数值为2,那么会形成左右布局,这个时候会有窗口会一分为二。
   左边的框架叫leftframe,右边的框架叫rightframe。它们的父(master)组件都是root。
   而角色所在的displayframe就在leftframe框架的上面。有一个叫bottomframe的框架
   在leftframe框架的下面。读者可在rightframe和bottomframe这两个框架中放置组件。
   这里需要tkinter知识,在turtle模块中它的缩写为TK。
"""
from sprites import *

screen = Screen(2)         # 新建左右分区的屏幕对象
screen.setup(800,600)
screen.title('write命令教学档案')

turtle = Sprite(shape='turtle')
turtle.color('blue')
turtle.speed(1)
root= screen._root

root.rightframe.pack(expand=0)
root.rightframe.config(padx=10,pady=10)     # 配置右框架背景色与间隙

upframe = TK.Frame(root.rightframe)
upframe.pack(side=TK.TOP,expand=1)
downframe = TK.Frame(root.rightframe)
downframe.pack(side=TK.TOP)

fontstyle = ('黑体',12,'normal')

b0 = TK.Button(upframe,text="import turtle",font=fontstyle)
b0.pack(anchor='w')
def reset():
    turtle.reset()
    turtle.color('blue')
b1 = TK.Button(upframe,text="turtle.reset()",font=fontstyle,command=reset)
b1.pack(anchor='w')

b3 = TK.Button(upframe,text="turtle.sety(250)",font=fontstyle,command=lambda:turtle.sety(250))
b3.pack(anchor='w')
b4 = TK.Button(upframe,text="turtle.write('风火轮编程')",font=fontstyle,command=lambda:turtle.write('风火轮编程'))
b4.pack(anchor='w')

b5 = TK.Button(upframe,text="turtle.sety(200)",font=fontstyle,command=lambda:turtle.sety(200))
b5.pack(anchor='w')
b6 = TK.Button(upframe,text="turtle.write('风火轮编程',align='center')",font=fontstyle,command=lambda:turtle.write('风火轮编程',align='center'))
b6.pack(anchor='w')

b7 = TK.Button(upframe,text="turtle.sety(150)",font=fontstyle,command=lambda:turtle.sety(150))
b7.pack(anchor='w')
b8 = TK.Button(upframe,text="turtle.write('风火轮编程',align='right')",font=fontstyle,command=lambda:turtle.write('风火轮编程',align='right'))
b8.pack(anchor='w')

b9 = TK.Button(upframe,text="turtle.sety(100)",font=fontstyle,command=lambda:turtle.sety(100))
b9.pack(anchor='w')
b10 = TK.Button(upframe,text="turtle.write('风火轮编程',font=('黑体',18,'normal'))",font=fontstyle,command=lambda:turtle.write('风火轮编程',font=('黑体',18,'normal')))
b10.pack(anchor='w')

b11 = TK.Button(upframe,text="turtle.sety(50)",font=fontstyle,command=lambda:turtle.sety(50))
b11.pack(anchor='w')
b12 = TK.Button(upframe,text="turtle.write('风火轮编程',font=('黑体',18,'bold'))",font=fontstyle,command=lambda:turtle.write('风火轮编程',font=('黑体',18,'bold')))
b12.pack(anchor='w')

b13 = TK.Button(upframe,text="turtle.sety(0)",font=fontstyle,command=lambda:turtle.sety(0))
b13.pack(anchor='w')
b14 = TK.Button(upframe,text="turtle.write('风火轮编程',font=('黑体',18,'italic'))",font=fontstyle,command=lambda:turtle.write('风火轮编程',font=('黑体',18,'italic')))
b14.pack(anchor='w')

b15 = TK.Button(upframe,text="turtle.sety(-50)",font=fontstyle,command=lambda:turtle.sety(-50))
b15.pack(anchor='w')
b16 = TK.Button(upframe,text="turtle.write('风火轮编程',move=True)",font=fontstyle,command=lambda:turtle.write('风火轮编程',move=True))
b16.pack(anchor='w')


lb = TK.Label(downframe,text='自行输入代码')
lb.pack(side=TK.TOP)
v = TK.StringVar(root, value="turtle.write('Python',align='center')")
code = TK.Entry(downframe,width=50,font=('宋体',12,'normal'),textvariable=v)
code.pack(side=TK.TOP)
def runcode():
    string = code.get()
    exec(string)
    
run = TK.Button(downframe,text=' 运 行 ',font=('宋体',12,'normal'),command=runcode)
run.pack(side=TK.TOP)



screen.mainloop()


发表在 python, sprites, tkinter, turtle | write命令教学档案已关闭评论

半透明滚动字幕

"""
   这是本人制作视频教程,用来在桌面上显示的一个字幕,
   精灵模块初体验__原地踏步猫的字幕效果显示程序
   ,本程序应该直接用tkinter模块编写能更为简单,
   这里只是演示如何重定义类的一些方法。
"""
from sprites import *

# 重定义ScrolledCanvas的初始化方法
def ScrolledCanvas_init(self,master,width=500,height=350,canvwidth=600,canvheight=500):
       """ 把滚动条给去掉了"""
       TK.Frame.__init__(self, master, width=width, height=height)
       self._rootwindow = self.winfo_toplevel()
       self.width, self.height = width, height
       self.canvwidth, self.canvheight = canvwidth, canvheight
       self.bg = "white"
       self._canvas = TK.Canvas(master, width=width, height=height,
                                 bg=self.bg, relief=TK.SUNKEN, borderwidth=2)
       self._canvas.pack(expand=1,fill='both')
       self.reset()
       self._rootwindow.bind('', self.onResize)
       
ScrolledCanvas.__init__ = ScrolledCanvas_init

def ScrolledCanvas_reset(self, canvwidth=None, canvheight=None, bg = None):
        """重置画布"""
        if canvwidth:
            self.canvwidth = canvwidth
        if canvheight:
            self.canvheight = canvheight
        if bg:
            self.bg = bg
        self._canvas.config(bg=bg,
                        scrollregion=(-self.canvwidth//2, -self.canvheight//2,
                                       self.canvwidth//2, self.canvheight//2))
        self._canvas.xview_moveto(0.5*(self.canvwidth - self.width + 30) /
                                                               self.canvwidth)
        self._canvas.yview_moveto(0.5*(self.canvheight- self.height + 30) /
                                                              self.canvheight)
ScrolledCanvas.reset = ScrolledCanvas_reset

def ScrolledCanvas_adjustScrolls(self):
        """ 校正画布尺寸
        """
        cwidth = self._canvas.winfo_width()
        cheight = self._canvas.winfo_height()
        self._canvas.xview_moveto(0.5*(self.canvwidth-cwidth)/self.canvwidth)
        self._canvas.yview_moveto(0.5*(self.canvheight-cheight)/self.canvheight)

ScrolledCanvas.adjustScrolls = ScrolledCanvas_adjustScrolls

s = 'Python精灵模块初体验__原地踏步猫'
screen = Screen()
screen.bgcolor('red')
screen.titlebar(False)
root = screen._root              # 窗口对象
root.wm_attributes('-alpha',0.7) # 设置窗口为全透明(0到1.0)
screen.setup(800,100)
screen.tracer(0,0)

# 下面的代码让窗口可以拖动.
oldx = 0
oldy = 0
def startmove(event):
    global oldx,oldy
    oldx = event.x
    oldy = event.y
def stopmove(event):
    global oldx,oldy
    oldx = 0
    oldy = 0        
def movewindow(event):
    global oldx,oldy     
    dx = event.x - oldx
    dy = event.y - oldy
    root.move(dx,dy)
screen.cv.bind("", startmove)
screen.cv.bind("", stopmove)
screen.cv.bind("",movewindow)

# 下面的代码按方向箭头则窗口能上下左右移动
screen.onkeypress(lambda:root.move(10),'Right')
screen.onkeypress(lambda:root.move(-10),'Left')
screen.onkeypress(lambda:root.move(0,-10),'Up')
screen.onkeypress(lambda:root.move(0,10),'Down')
screen.listen()

# 下面的TK是就是tkinter
popup = TK.Menu(screen._root, tearoff=0)
popup.add_command(label="关于本程序",command=lambda:showinfo('关于','本程序由李兴球开发\n\nQQ:406273900\n\nwww.lixingqiu.com'))
popup.add_command(label="打开主页",command=lambda:os.system('explorer https://www.lixingqiu.com'))
popup.add_command(label="退出本程序",command=lambda:screen.bye())

def do_popup(event):
    """显示弹出菜单"""
    try:
        popup.tk_popup(event.x_root, event.y_root + 10, 0)
    finally:
        # 确保释放按键
        popup.grab_release()
screen.cv.bind("", do_popup)   # 画布绑定鼠标右键

for x in range(400):
    root.move(0,-1)
    root.update()
    time.sleep(0.01)
# 单击鼠标左键开始
#m1 = Mouse()                # 鼠标左键
#while not m1.down():screen.update()

ft_context = ('微软雅黑',24,'normal')
t = Sprite(visible=False,pos=(-600,-15))
t.color('white')
clock = Clock()
t.write(s,align='center',font=ft_context)
worditem = t.items[-1]                   # 字的编号
wordbbox = screen.cv.bbox(worditem)      # 字的绑定盒子
wordwidth = wordbbox[-1] - wordbbox[0]   # 字的宽度
def scrolledtext():
    t.clear()
    t.write(s,align='center',font=ft_context)
    t.wait()
    t.fd(2)
    if t.xcor() - wordwidth/2 >300:t.setx(-200-wordwidth/2)
    clock.tick(60)
    if t.xcor()==0:t.wait(1)
    screen.ontimer(scrolledtext)
scrolledtext()
screen.mainloop() 

发表在 python, sprites, tkinter, turtle | 半透明滚动字幕已关闭评论

夜幕下的霓虹_闪烁版


在海龟画图屏幕上打几个彩色的点点,这很多学过Python的人都会。可是如何让这些点点都闪烁起来,该如何编程呢?秘密就在本源代码,以下是部分代码预览,它完成了打静态彩点的任务。

from random import *
from turtle import *
from time import sleep

cs = ['red','orange','yellow','green',
      'cyan','blue','purple','pink','magenta']

screen = Screen()
screen.setup(800,600)
screen.bgcolor('black')
screen.title('夜幕下的霓虹_闪烁版')
screen.tracer(0,0)

tom = Turtle(visible=False)
tom.penup()

for _ in range(100):
    x = randint(-400,400)
    y = randint(-300,300)
    tom.goto(x,y)
    c = choice(cs)
    tom.color(c)   
    tom.dot(20)
pass

# 把下面隐藏的代码接上,彩色点点就能闪烁起来了!几块钱的小意思,省去你大量探索的时间,确实是高性价比呀。

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, tkinter, turtle | 夜幕下的霓虹_闪烁版已关闭评论

按数字键练习坐标程序

"""

   按数字键练习坐标程序.py
   演示用的一个程序,本程序需要sprites模块支持,如果无法运行,
   请先在cmd窗口下输入 pip install sprites安装这个模块。
   操作方法:按从1到9和a的键让海龟移到相应的坐标。
   鼠标左键可以直接拖动海龟,鼠标右键可以拖动窗体。按空格结束。
"""

from sprites import *

screen = Screen()
screen.setup(480,360)
screen.bgpic('xy-grid.png')
screen.titlebar(False)
root = screen._root
root.wm_attributes('-alpha',0.9) # 设置窗口为全透明(0到1.0)

# 下面的代码让窗口可以拖动.
oldx = 0
oldy = 0
def startmove(event):
    global oldx,oldy
    oldx = event.x
    oldy = event.y
def stopmove(event):
    global oldx,oldy
    oldx = 0
    oldy = 0        
def movewindow(event):
    global oldx,oldy     
    dx = event.x - oldx
    dy = event.y - oldy
    root.move(dx,dy)
screen.cv.bind("", startmove)
screen.cv.bind("", stopmove)
screen.cv.bind("",movewindow)

t = Sprite(shape='turtle') # Turtle
t.color('red')

def go1():
    cor = (100,100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go1,'1')

def go2():
    cor = (-100,100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go2,'2')

def go3():
    cor = (-100,-100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go3,'3')

def go4():
    cor = (100,-100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go4,'4')

def go5():
    cor = (200,100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go5,'5')

def go6():
    cor = (-200,100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go6,'6')

def go7():
    cor = (-200,0)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go7,'7')

def go8():
    cor = (-200,-100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go8,'8')

def go9():
    cor = (200,-100)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go9,'9')

def go10():
    cor = (200,0)
    t.goto(cor)
    screen.title(str(cor))    
screen.onkeypress(go10,'a')
    
screen.onkeypress(lambda:screen.bye(),'space')

screen.listen()
screen.mainloop()

发表在 python, sprites, turtle | 按数字键练习坐标程序已关闭评论

卡通坐标练习程序

"""
   卡通坐标练习程序,这是一个用Python开发的学习与练习坐标的小程序, 以下为预览程序.
"""
import time
import random
from turtle import *

def slow_write(t,string):
    """慢慢写字的函数"""
    for char in string:
        t.write(char,align='center',font=('黑体',14))
        t.setx(t.xcor() + 20)
        time.sleep(0.2)
        
screen = Screen()
screen.title('坐标练习')
screen.bgcolor("black")

cors = []                                     # 坐标表
stamps = []                                   # 图章表 
names = ['飞机','苹果','女孩','香蕉','蝙蝠',
         '蜜蜂','铃铛','单车','小猫','小老虎',
         '螃蟹','小狗','小象','小鱼','小猴',
         '老鼠','章鱼','小鸟','企鹅','兔子',
         '机器人','鲨鱼','汽球','海星','斑马']
images = [f'images/{i}.gif' for i in range(25)]

[screen.addshape(im) for im in images]

distance = 80
init_x = -100
init_y = -100

t = Turtle(visible=False)
t.penup()
t.color("cyan")
t.write("卡通坐标练习程序",font=("",32),align='center')
time.sleep(5)
screen.bgcolor('white')
t.color('blue')
t.clear()

for index in range(25):
    x = index // 5
    y = index % 5
    cors.append((x+1,y+1))
    x = init_x + distance * x
    y = init_y + distance * y
    t.goto(x,y)
    image = images[index]
    t.shape(image)
    stamps.append(t.stamp())

for index in range(5):
    t.goto(init_x + index * distance,init_y-distance)
    t.write(f"第{index+1}列",align='center',font=('黑体',14))

for index in range(5):
    t.goto(init_x - distance,init_y + distance * index)
    t.write(f"第{index+1}排",align='center',font=('黑体',14))

strings = ['坐标是用来表示位置的两个数。',
           '上面的飞机,它在第一列,第一排,它的坐标表示为(1,1)',
           '小狗是在第3列第2排,所以它的坐标记为(3,2)',
           '而斑马在第5列第5排,所以它的坐标记为(5,5)',
           '懂了吗?要开始测验了!',
           '接下来,请在对话框中输入以逗号隔开的坐标',]

w = Turtle(visible=False)
w.penup()

for s in strings:
    w.goto(init_x-150,init_y-150)
    slow_write(w,s)
    time.sleep(3)
    w.clear()

w.goto(0,-270)

# iii列表是打乱顺序的索引表
iii = [i for i in range(25)]
random.shuffle(iii)

pass
# 本程序不完整,读者可扫码获取素材与完整源码的下载链接.

screen.mainloop()

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, turtle | 卡通坐标练习程序已关闭评论

Python勾股定理教学演示程序_为中小学信息技术教育添砖加瓦_Python精灵模块


本程序需要Python精灵模块V1.23以上版本,如果你无法运行,请用pip uninstall sprites先卸载,再用pip install sprites安装.

"""
   Python勾股定理粒子演示,本程序由sprites模块制作,请安装最新版本的sprites模块,要不然找不到相关方法.
"""
import math
from sprites import *

def spaceorwait():
    start = time.time()
    while not spacekey.down():
      if  time.time()-start>1:break
      screen.update()
def platlist(cors):
    """扁平化列表"""
    d = []
    for rows in cors:
        for x,y in rows:
            d.append((x,y))
    return d

def placeball(cors):
    stamps = []
    for rows in cors:        
        for x,y in rows:
            t.goto(x,y)
            sid = t.stamp()
            stamps.append(sid)
    return stamps

screen = Screen()
screen.bgcolor('dodger blue')
screen.title('勾股定理教学演示by李兴球')
screen.listen()
spacekey = Key('space')

ft = ('楷体',32,'normal')
ft2 = ('黑体',16,'normal')
w = Sprite(1,visible=False)
w.scale(0.4)
w.color('lime')
w.goto(0,240)
w.write('观看与思考',align='center',font=ft)
w.goto(0,210)
w.color('yellow')
w.write('这是演示什么定律',align='center',font=ft2)
w.goto(0,180)
w.color('cyan')
w.write('本程序用Python精灵模块制作',align='center',font=ft2)

t = Sprite(1,visible=False)
t.scale(0.4)
t.color('white')

initx,inity = -50,-100
while not spacekey.down():screen.update()

t.play('Crashteroids.wav',loop=True)
while True:

以下代码省略......


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | Python勾股定理教学演示程序_为中小学信息技术教育添砖加瓦_Python精灵模块已关闭评论

画太极图教学辅助程序

"""
   画太极图教学辅助程序。
   本程序采用Screen(3)把窗口整体分为两个大区。
   上面的是root.topframe,下面的是root.bottomframe。
   在root.bottomframe框架中,又分为左右两个框架,
   名称分别是lframe和rframe。
   其中lframe又分为frameup和framedown两个框架。
   而rframe又分为rframeleft和rframeright两个框架。
   为更好的理解,请查看'程序的窗口分区示意图.png'图形。
"""
from sprites import *

def draw_filled_circle():
    """画填充颜色的圆形"""
    x = int(xvar.get())
    y = int(yvar.get())
    radius = int(radiusvar.get())
    color = colorvar.get()
    angle = int(anglevar.get())
    pdstatus = turtle.isdown()    # 保存是否落笔状态    
    turtle.penup()
    turtle.goto(x,y)
    turtle.pendown()
    turtle.pencolor(color)
    screen.tracer(0,0)
    for x in range(angle*10):
        turtle.fd(radius)
        turtle.bk(radius)
        turtle.rt(0.1)                
    if pdstatus:
        turtle.pendown()
    else:
        turtle.penup()
    screen.tracer(1,0)
    
    
screen = Screen(3)              # 上下框架结构topframe和bottomframe
screen.bgcolor('#a0aea2')
screen.title('画太极图教学辅助程序')

turtle = Sprite(shape='turtle') # 新建一只海龟
turtle.penup()
turtle.pensize(2)
turtle.shapesize(2,2,2)
turtle.setheading(90)
turtle.color('black','yellow')
turtle.say('你好,请单击按钮',10,False)

root = screen._root
root.topframe.pack(expand=1,fill='both')
root.bottomframe.pack(expand=0,fill='both',padx=10)

lframe = TK.Frame(root.bottomframe,bg='yellow')
lframe.pack(side=TK.LEFT)
rframe = TK.Frame(root.bottomframe,bg='pink')
rframe.pack(side=TK.LEFT,expand=1,fill='both')

frameup = TK.Frame(lframe,bg='blue')
frameup.pack(side=TK.TOP,expand=0,fill='both',padx=10)
framedown = TK.Frame(lframe,bg='cyan')
framedown.pack(side=TK.BOTTOM,expand=0,fill='both',padx=10,pady=10)

drawcircle = TK.Button(frameup,text='画圆形',font=('黑体',13,'normal'),command=draw_filled_circle)
drawcircle.pack(side=TK.LEFT)

xvar = TK.StringVar(value='0')
x_lable = TK.Label(frameup,text='x:')
x_lable.pack(side=TK.LEFT)
x_cor = TK.Entry(frameup,width=5,textvariable=xvar)
x_cor.pack(side=TK.LEFT)

yvar = TK.StringVar(value='0')
y_lable = TK.Label(frameup,text='y:')
y_lable.pack(side=TK.LEFT)
y_cor = TK.Entry(frameup,width=5,textvariable=yvar)
y_cor.pack(side=TK.LEFT)

colorvar = TK.StringVar(value='black')
color_lable = TK.Label(frameup,text='颜色:')
color_lable.pack(side=TK.LEFT)
color = TK.Entry(frameup,width=8,textvariable=colorvar)
color.pack(side=TK.LEFT)

radiusvar = TK.StringVar(value='100')
radius_lable = TK.Label(frameup,text='半径:')
radius_lable.pack(side=TK.LEFT)
radius = TK.Entry(frameup,width=8,textvariable=radiusvar)
radius.pack(side=TK.LEFT)

anglevar= TK.StringVar(value='180')
angle_lable = TK.Label(frameup,text='角度:')
angle_lable.pack(side=TK.LEFT)
angle = TK.Entry(frameup,width=8,textvariable=anglevar)
angle.pack(side=TK.LEFT)

def cmd1():
    xvar.set('0')
    yvar.set('0')
    colorvar.set('black')
    radiusvar.set('100')
    anglevar.set('180')
    draw_filled_circle()
    
def cmd2():
    xvar.set('0')
    yvar.set('0')
    colorvar.set('white')
    radiusvar.set('100')
    anglevar.set('180')
    draw_filled_circle()
    
def cmd3():
    xvar.set('0')
    yvar.set('50')
    colorvar.set('white')
    radiusvar.set('50')
    anglevar.set('360')
    draw_filled_circle()
    
def cmd4():
    xvar.set('0')
    yvar.set('-50')
    colorvar.set('black')
    radiusvar.set('50')
    anglevar.set('360')
    draw_filled_circle()
    
def cmd5():
    pdstatus = turtle.isdown()    # 保存是否落笔状态
    turtle.penup()
    turtle.goto(0,-50)
    turtle.dot(20,'white')    
    if pdstatus:
        turtle.pendown()
    else:
        turtle.penup()
def cmd6():
    pdstatus = turtle.isdown()    # 保存是否落笔状态
    turtle.penup()
    turtle.goto(0,50)
    turtle.dot(20,'black')    
    if pdstatus:
        turtle.pendown()
    else:
        turtle.penup()
     
step1 = TK.Button(framedown,text='第一步:在(0,0)坐标向右画一个半径为100的黑色半圆',font=('黑体',13,'normal'),command=cmd1)
step1.pack(side=TK.TOP)
step2 = TK.Button(framedown,text='第二步:在(0,0)坐标向右画一个半径为100的白色半圆',font=('黑体',13,'normal'),command=cmd2)
step2.pack(side=TK.TOP)
step3 = TK.Button(framedown,text='第三步:在(0,50)坐标向右画一个半径为50的白色半圆',font=('黑体',13,'normal'),command=cmd3)
step3.pack(side=TK.TOP)
step4 = TK.Button(framedown,text='第四步:在(0,-50)坐标向右画一个半径为50的黑色半圆',font=('黑体',13,'normal'),command=cmd4)
step4.pack(side=TK.TOP)
step5 = TK.Button(framedown,text='第五步:在(0,-50)坐标打一个白色的小圆点',font=('黑体',13,'normal'),command=cmd5)
step5.pack(side=TK.TOP)
step6 = TK.Button(framedown,text='第六步:在(0,50)坐标打一个黑色的小圆点',font=('黑体',13,'normal'),command=cmd6)
step6.pack(side=TK.TOP)


# 在bottomframe的右边放几个常用操作按钮
rframeleft = TK.Frame(rframe,bg='dodger blue')
rframeleft.pack(side=TK.LEFT,expand=1,fill='both')
rframeright = TK.Frame(rframe,bg='green')
rframeright.pack(side=TK.LEFT,expand=1,fill='both')

clearb = TK.Button(rframeleft,text='清除',font=('黑体',13,'normal'),command=lambda:turtle.clear())
clearb.pack(side=TK.TOP)
fd10b = TK.Button(rframeleft,text='前进10',font=('黑体',13,'normal'),command=lambda:turtle.fd(10))
fd10b.pack(side=TK.TOP)
bk10b = TK.Button(rframeleft,text='倒退10',font=('黑体',13,'normal'),command=lambda:turtle.bk(10))
bk10b.pack(side=TK.TOP)
right10b = TK.Button(rframeleft,text='右转10度',font=('黑体',13,'normal'),command=lambda:turtle.right(10))
right10b.pack(side=TK.TOP)
left10b = TK.Button(rframeleft,text='左转10度',font=('黑体',13,'normal'),command=lambda:turtle.left(10))
left10b.pack(side=TK.TOP)
pendownb = TK.Button(rframeleft,text='落笔',font=('黑体',13,'normal'),command=lambda:turtle.pendown())
pendownb.pack(side=TK.TOP)
penupb = TK.Button(rframeleft,text='抬笔',font=('黑体',13,'normal'),command=lambda:turtle.penup())
penupb.pack(side=TK.TOP)

def gohome():
    turtle.home()
    turtle.setheading(90)
    
homeb = TK.Button(rframeright,text='回家',font=('黑体',13,'normal'),command=gohome)
homeb.pack(side=TK.TOP)
randomb = TK.Button(rframeright,text='随机位置',font=('黑体',13,'normal'),command=lambda:turtle.randompos())
randomb.pack(side=TK.TOP)

def callaskcolor():
    c = askcolor()
    turtle.color(c[1])    
colorb = TK.Button(rframeright,text='颜色',font=('黑体',13,'normal'),command=callaskcolor)
colorb.pack(side=TK.TOP)

def runcommand():
    c = screen.textinput('运行','海龟名称为turtle,屏幕名称为screen,请自行输入命令:')
    if c=='' or c == None:return
    try:
        exec(c)
    except Exception as e :
        showinfo('错误',str(e))
    
runb = TK.Button(rframeright,text='运行',font=('黑体',13,'normal'),command=runcommand)
runb.pack(side=TK.TOP)

screen.mainloop()

发表在 python, sprites, tkinter, turtle | 画太极图教学辅助程序已关闭评论

可拖动无标题栏窗体

"""
   可拖动无标题栏窗体.py
   请按下鼠标中键移动这个窗体。
   屏幕的root是tkinter的窗体的一个子类,类名为_Root
   本程序使用重定义了的_Root类。在sprites模块中给它增加了move方法,
   它能让窗体相对移动,定义原形为:move(self,dx,dy)。
   还有goto方法,让窗体定位到桌面上的某个坐标。
   还有position方法,获取窗体在桌面中的坐标。
   注意桌面的坐标系为右下为正。spritesV1.22版本以上适用!
"""
from sprites import *

screen = Screen()
screen.titlebar(0)               # 去除标题栏
screen.setup(480,360)     
screen.bgcolor('lime')

root = screen._root
root.wm_attributes('-alpha',0.7) # 设置窗口为全透明(0到1.0)

oldx = 0
oldy = 0
def startmove(event):
    global oldx,oldy
    oldx = event.x
    oldy = event.y
def stopmove(event):
    global oldx,oldy
    oldx = 0
    oldy = 0        
def movewindow(event):
    global oldx,oldy     
    dx = event.x - oldx
    dy = event.y - oldy
    root.move(dx,dy)
screen.cv.bind("", startmove)
screen.cv.bind("", stopmove)
screen.cv.bind("",movewindow)

bug = Sprite(visible=False)
ft = ('',18,'bold')
bug.write('请按下鼠标中键移动这个窗体',align='center',font=ft)

screen.mainloop()


发表在 python, sprites, tkinter, turtle | 可拖动无标题栏窗体已关闭评论

上下左右键可移动透明无标题栏窗体


以下是部分代码预览:

"""
   上下左右键可移动透明无标题栏窗体.py
   请按上下左右键移动这个窗体。
   屏幕的root是tkinter的窗体的一个子类,类名为_Root
   本程序使用重定义了的_Root类。在sprites模块中给它增加了move方法,
   它能让窗体相对移动,定义原形为:move(self,dx,dy)。
   还有goto方法,让窗体定位到桌面上的某个坐标。
   还有position方法,获取窗体在桌面中的坐标。
   注意桌面的坐标系为右下为正。spritesV1.22版本以上适用!
"""
from sprites import *

screen = Screen()
screen.titlebar(0)               # 去除标题栏
screen.setup(480,360)     
screen.bgcolor('dodger blue')

root = screen._root
root.wm_attributes('-alpha',0.7) # 设置窗口为全透明(0到1.0)
root.goto(0,0)                   # 定位窗体到左上角
time.sleep(1)

# 不断定位窗体的坐标到(c,c)
for c in range(0,200):
    root.goto(c,c)               # 定位到(c,c)坐标。
    root.update() 
    time.sleep(0.01)
    
bug = Sprite(visible=False)
ft = ('',18,'bold')
bug.write('请按上下左右方向箭头移动窗体',align='center',font=ft)


以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, tkinter, turtle | 上下左右键可移动透明无标题栏窗体已关闭评论

pip快速安装Python模块秘籍视频


大家知道,Python的各种外置模块可以通过pip命令进行安装.

如要安装pygame模块,只要输入 pip install pygame即可。

可是,这个命令安装时只会从国外的网站下载模块,结果会很慢,

经常出现安装一半就中断,以致于安装不上模块的情况.

本人就经常遇到这种情况,现在问题终于解决了,那就是pip命令是可以配置的.

怎么配置呢,我们要给它新建一个文件,叫php.ini

在这个文件中,可以配置pip访问的服务器的网站.

我们把这网址改为国内的就行了,并且把这个php.ini文件要放在Python

安装文件夹下面的Scripts目录,然后我们用pip 安装各种模块就更得多了!

有些入门者不会知道Python的安装目录到底在哪里,这里提供一种方法,

那就是打开IDLE,选择File/Path Browser,这时候就能看到Python的各种路径。

一般第五个路径就是Python的安装路径,或者在IDLE中导入sys模块,然后输入sys.path[5]

这就是Python的安装目录,然后找到Scripts目录,把php.ini文件复制过去就行了。

以下是pip.ini文件内容:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

"""
   本程序会把pip.ini复制到Python安装文件夹的Scripts目录
"""

import os
import sys
import shutil

pipfile = 'pip.ini'

if not os.path.exists(pipfile):
    input(pipfile + '配置文件不存在')
    sys.exit()

path = sys.path[4] + os.sep + 'Scripts' + os.sep + pipfile

shutil.copyfile(pipfile,path)
if os.path.exists(path):
    print(path)
    input("成功复制!")
else:
    input("复制失败")

发表在 python | pip快速安装Python模块秘籍视频已关闭评论

透明幻灯片字幕模拟


本程序双击后,会有一个透明的窗体出现,然后字幕从左到右显示出来,再次单击则字幕从左到右直到消失.
以下是部分代码预览:

"""
   透明幻灯片字幕模拟
"""
from sprites import *

s = '第一课 树立远大的理想'
screen = Screen()
screen.bgcolor('blue')
screen.titlebar(False)
root = screen._root              # 窗口对象
root.wm_attributes('-alpha',0.7) # 设置窗口为半透明(0到1.0)
screen.setup(800,600)

ft = ('楷体',38,'bold')
t = Sprite(visible=False,pos=(-500,0))
t.color('magenta')
clock = Clock()
for x in range(100):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.fd(5)
    clock.tick(60)

m1 = Mouse()          # 鼠标左键

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 透明幻灯片字幕模拟已关闭评论

新冠状病毒疫情简单模拟程序

"""
  新冠状病毒疫情简单模拟程序,以下程序用
  红点表示已经感染的人,用绿点表示未感染的人,用白点表示医生
  
"""

from sprites import *

radius = 150                # 活动半径

red_amounts = 30            # 1、已感染的数量
red_speed_k = 5             # 2、红点移动速度因子

lime_amounts = 300         # 3、未感染人群数量
lime_protects = 300        # 4、有防护措施的数量
lime_speed_k = 0           # 5、未感染人的移动速度

white_amounts = 50          # 6、白衣天使数量
white_speed_k = 5           # 7、白衣天使移动速度

width,height = 500,500
screen = Screen()
screen.tracer(0,0)
screen.bgcolor('black')
screen.setup(width,height)
screen.title('新冠状病毒疫情简单模拟程序')
reds = [Sprite(shape='dot') for x in range(red_amounts)]
for p in reds:
    p.scale(2)
    p.set_tag('red')
    p.randomheading()
    p.speed = red_speed_k * random.randint(1,5)  # 重定义speed    
    p.gotorandom()
    while p.distance((0,0))>radius:
         p.gotorandom()
    p.color('red')

limes = [Sprite(shape='dot') for x in range(lime_amounts)]
counter = 0
for p in limes:
    p.scale(2)
    p.set_tag('lime')
    p.randomheading()
    p.speed = lime_speed_k * random.randint(1,5)
    p.protect = False          # 自定义属性
    if counter < lime_protects:
        p.protect = True       # 如果带了口罩,碰到红色粒子不会变成红色粒子
        counter = counter + 1   
    p.gotorandom()
    while p.distance((0,0))>radius:
         p.gotorandom()
    p.color('lime')

whites = [Sprite(shape='dot') for x in range(white_amounts)]
for p in whites:
    p.scale(2)
    p.set_tag('white')
    rr = random.choice(reds)  # 随机挑一名红色感染者,
    p.heading(rr)
    p.speed = white_speed_k * random.randint(1,5)    
    p.gotorandom()
    while p.distance((0,0))>radius:
         p.gotorandom()
    p.color('white')
screen.update()
running = True
while running:
    for r in reds[:]:
        if reds == []:break
        r.fd(r.speed)
        if r.collide_others('white'):  # 碰到医生
            r.color('lime')
            r.set_tag('lime')
            r.protect = True
            r.speed=0
            reds.remove(r)
            limes.append(r)
        r.update()    
        if r.distance((0,0)) > radius:r.right(180)
    for g in limes[:]:
        if reds == []:break
        g.fd(g.speed)
        if g.protect == False and g.collide_others('red'):
            g.color('red')
            g.set_tag('red')
            g.speed = red_speed_k * random.randint(1,5)
            limes.remove(g)
            reds.append(g)
        g.update()
        g.bounce_on_edge()
    for w in whites:
        if reds == []:break
        if random.randint(1,100) == 1:
           rr = random.choice(reds)  # 随机挑一名红色感染者,
           w.heading(rr)
        w.fd(w.speed)
        w.update()
        if w.distance((0,0)) > radius:w.right(180)
    if len(reds) == 0 :running = False

        

第一种情况:
没有医护人员,没有防护措施!人们到处随便走动,
不用多久,全部感染病毒.

red_amounts = 30 # 1、已感染的数量
red_speed_k = 5 # 2、红点移动速度因子

lime_amounts = 300 # 3、未感染人群数量
lime_protects = 0 # 4、有防护措施的数量
lime_speed_k = 5 # 5、未感染人的移动速度

white_amounts = 0 # 6、白衣天使数量
white_speed_k = 0 # 7、白衣天使移动速度

第二种情况:

没有医护人员,50%的人有防护措施,人们不走动,
不用多久,始终是50%的人感染,50%的人未感染.

red_amounts = 30 # 1、已感染的数量
red_speed_k = 5 # 2、红点移动速度因子

lime_amounts = 300 # 3、未感染人群数量
lime_protects = 150 # 4、有防护措施的数量
lime_speed_k = 0 # 5、未感染人的移动速度

white_amounts = 0 # 6、白衣天使数量
white_speed_k = 0 # 7、白衣天使移动速度

说明有防护措施非常重要,可以避免不被感染!

第三种情况:

有50名医护人员,感染者亦不走动,
100%的未感染人有防护措施,人们不走动,
医防人员一诞生,便扑向感染人员,不用多久,感染人全部治好.

red_amounts = 30 # 1、已感染的数量
red_speed_k = 5 # 2、红点移动速度因子

lime_amounts = 300 # 3、未感染人群数量
lime_protects = 300 # 4、有防护措施的数量
lime_speed_k = 0 # 5、未感染人的移动速度

white_amounts = 50 # 6、白衣天使数量
white_speed_k = 5 # 7、白衣天使移动速度

这说明人们意识到事情的严重性及有医护人员的参与下,
病毒能很快被消灭!那么现在的情况就是这样的,所以大家
完全不要担心,疫情是完全可控的!

发表在 python, sprites, turtle | 新冠状病毒疫情简单模拟程序已关闭评论

去标题栏与半透明窗口

"""
   去标题栏与半透明窗口.py
   本程序演示如何去掉标题栏以及如何获取root,以及窗口为半透明。
   需要sprites的V1.20以上版本才会有titlebar命令。
   
"""
   
from sprites import *

screen = Screen()
screen.titlebar(False)           # 设定标题栏为假(关掉)
screen.setup(480,360)     
screen.bgpic('res/sky.png')

root = screen._root              # 窗口对象
root.wm_attributes('-alpha',0)   # 设置窗口为全透明(0到1.0)
screen.delay(10)                 # 绘画延时为10毫秒

bug = Sprite()
bug.color('red')
bug.pensize(10)
for s in range(1,61):
   root.wm_attributes('-alpha',s/100)
   root.update()
   time.sleep(0.1)       
bug.speed(1)
bug.pendown()    
while True:
  bug.fd(100)
  bug.rt(90)

发表在 python, sprites, tkinter, turtle | 去标题栏与半透明窗口已关闭评论

查找序列帧函数

"""
   查找序列帧函数,
   本程序编写一个函数,查找一序列帧图,
   不过要求这些图片的文件名要从0开始。

"""
import os
import glob

def _findframes(foldername):
    """本函数返回文件夹下面序列帧图,要求这些图片的文件名形式为
       0.png,1.png,2.png,3.png......
       返回所有图片列表。
    """
    exts = ['.png','.gif','.jpg','.jpeg']
    
    for ext in exts:
        files = glob.glob(foldername + os.sep + '*' + ext)
        if files == []:continue
        frames = []
        for index in range(len(files)):
            file = foldername + os.sep + str(index) + ext
            if os.path.exists(file):
                frames.append(file)
            else:
                break
        if frames!=[]:break
    return frames
    
shape = 'cats'
#shape= 'E:\\Python\\sprites\\100_闪电侠接金币_精灵版\\coin'
fs = _findframes(shape)
print(fs)

发表在 python | 查找序列帧函数已关闭评论

原地踏步(录屏)

"""
   原地踏步(录屏).py
   本程序主要演示如何使用screen.save命令进行录屏,
   它会对当前窗口进行抓屏,所以在运行程序时不要把
   当前窗口遮住、移开或最小化,screen.save可以加文件名参数,
   写上文件名参数的话,由于会写文件到磁盘,会让程序运行速度变慢。
   也可以不加任何参数,这样它会返回图形对象,以便接下来的程序保存它。
   以下是save方法的定义原形:
   save(self,filename=None,size=None,margin=5,full=False):
   size是用来指定区域的,是一个四元组,margin为边距,full表示是否截全屏。
  
"""
from sprites import *

# 列表推导式,frames存储每张猫的造型帧图
frames = [f'cats/{i}.png' for i in range(16)]

screen = Screen()            # 新建屏幕
screen.setup(480,360)        # 设定宽高
screen.bgpic('res/sky.png')  # 背景图像

cat = Sprite(shape=frames)   # 新建角色

frames = []                  # 重定义frames,用于保存每一帧
for x in range(10):          # 重复执行10次
    cat.nextcostume()        # 下一个造型
    cat.wait(0.1)            # 等待0.1秒
    im = screen.save()       # 保存当前窗口屏幕为im图形对象
    frames.append(im)        # 添加到frames列表

yes = askyesno('保存','要把每一帧动画保存到frames文件夹吗?\n否则会直接关闭窗口。')


以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 原地踏步(录屏)已关闭评论

音频视分离与合成及添加循环背景音乐的步骤

2020年正月初四,“鼠疫”横行,为了录制Python培训视频,今天下午和晚上就干了下面这件事:

音频视分离与合成及给视频添加循环背景音乐的步骤。

1、用01_分离视频和音频.bat,把原始.wmv拆成splitedvideo.wmv和分离后的音频.mp3

批处理为:

ffmpeg -i  原始.wmv -an -vcodec copy splitedvideo.wmv
FFmpeg.exe -i  原始.wmv -vn -ar 44100 -ac 2 -ab 192 -f mp3  no_noise.mp3
pause

2、用cooledit采样进行人工降噪后形成no_noise.mp3文件,用cooledit采样的主要步骤是要人工分析音频噪音的波形,然后输出为样本,最后cooledit会把整个波形文件的含有样本的音频段删除。

3、然后用03_合成音频和视频.bat批处理文件 把 splitedvideo.wmv和no_noise.mp3进行合成为output.wmv,这时就能用了,如果要增加背景音乐,使用下面的代码即可:

批处理为: ffmpeg -i splitedvideo.wmv -i no_noise.mp3 -vcodec copy -acodec copy output.wmv
pause

4、可以用04_增加背景音乐.bat 添加循环播放的背景音乐。

ffmpeg -i output.wmv -i c:/步步高古筝.wav -filter_complex [1:0]volume=0.1[a1];[0:a][a1]amix=inputs=2:duration=first;[1:a]aloop=loop=-1:size=2e+09[out];[out][0:a]amix -ss 0 -t 60 -y 最终.mp4
pause

如果能把降噪过程搞为自动,就能一键搞定了。但是每次的噪音采样可能有些不同,所以还是分步吧。

 

 

发表在 Uncategorized, 杂谈 | 音频视分离与合成及添加循环背景音乐的步骤已关闭评论

Python问卷调查器

"""
   问卷调查器
   本程序演示做一个答题器。在sprites模块中,生成的窗口可以被分区。
   本程序的窗口分为上和下区。上面的框架叫topframe,下面的框架叫bottomframe。
   它们的master都是root。
   
   角色所在的滚动画布的master框架为displayframe,它在topframe框架中的左面。
   rightframe在topframe框架的右面。也就是说rightframe和displayframe的master都是topframe。
   读者可在rightframe和bottomframe中放置组件。
"""
from sprites import *

q1 = ['你最喜欢的职业是什么?',
      'A、教师',
      'B、律师',
      'C、自由职业',
      'D、企业家']
q2 = ['你喜欢一个人会有什么表现?',
      'A、总想着那个人',
      'B、天天看那个人的朋友圈',
      'C、总想着见面',
      'D、舍得付出']
q3 = ['你的理想是什么?',
      'A、科学家',
      'B、工程师',
      'C、政治家',
      'D、教育家']
q4 = ['如果你身体处于亚健康状态,会如何调理?',
      'A、少操心',
      'B、少食多餐,饮食均衡',
      'C、生活有规律',
      'D、不熬夜']
q5 = ['你向往什么样的生活?',
      'A、悠闲的田园生活',
      'B、快节奏的城市生活',
      'C、花天酒地的生活',
      'D、风花雪夜的生活']
questions = [q1,q2,q3,q4,q5]

answers = [[0,0,0,0],
           [0,0,0,0],
           [0,0,0,0],
           [0,0,0,0],
           [0,0,0,0]]
def sendanswer():
    """问卷调查结束后,把答案发送,也可以提交到网络哦!这里只是简单用showinfo显示一下"""
    info = ''
    for _ in answers:
        info = info + str(_) + "\n"
    filename = username + '的回答.txt'
    # 需要对filename进行过滤,去掉?,\,/,',""等字符
    #f = open(username + '的回答.txt',mode='w')
    #f.write(info)
    #f.close()
    screen.update()
    #os.system(filename)    
    showinfo("恭喜","你的回答已经成功发送到老师怀里了。")
    
def displayquestion(index):
    bug.clear()
    # 首先显示title
    info = 'No ' + str(index+1) + ":" + questions[index][0]
    bug.goto(0,120)
    bug.write(info,align='center',font=('楷体',18,'normal'))
    bug.goto(-150,50)
    for i in range(1,5):
        info = questions[index][i]
        bug.write(info,font=('楷体',14,'normal'))
        bug.addy(-50)        
    
def previousquestion():
    """回到上一题"""
    global index
    if index > 0:
       index -= 1
       displayquestion(index)
       for i in range(4):           
           value = answers[index][i]
           checkvars[i].set(value)  
           

def nextquestion():
    """到下一题"""
    global index
    if index < len(questions):
       # 首先收集当前答案信息到answers列表
       for i in range(4):
          value = checkvars[i].get()
          answers[index][i] = value
       
       # 然后显示下一题 
       index += 1
       if index == len(questions):
           bug.clear()
           bug.goto(0,100)
           bug.color('magenta')
           bug.write('Congratulations',align='center',font=('楷体',28,'normal'))
           bug.color('black')
           bug.goto(0,50)
           bug.write('问卷调查完毕!',align='center',font=('楷体',18,'normal'))
           bug.addy(-50)
           bug.write('请按下面的提交按钮',align='center',font=('楷体',18,'normal'))
           bug.addy(-50)
           bug.write('把答案发送给老师',align='center',font=('楷体',18,'normal'))
           
           # 销毁上一题,复选框和下一题按钮
           previousframe.destroy()
           checkframe.destroy()
           nextframe.destroy()
           b = TK.Button(root.bottomframe,text='   提  交   ',command=sendanswer,font=('楷体',28,'normal'))
           b.pack()
           
       else:
          displayquestion(index)
          # 把状态显示出来
          for i in range(4):           
            value = answers[index][i]
            checkvars[i].set(value) 
       

screen = Screen(3)         # 上下分区模式
screen.setup(540,480)
screen.bgcolor('cyan')
screen.title('问卷调查器')
root= screen._root
root.config(bg='#0099aa')
root.rightframe.pack_forget()
root.bottomframe.config(bg='#829684',padx=10,pady=10)
root.bottomframe.pack_forget()
username = screen.textinput('姓名','请输入姓名:')

bug = Sprite(visible=False)
bug.sety(100)
bug.color('magenta')
info = '问 卷 小 调 查'
bug.write(info,align='center',font=('微软雅黑',20,'normal'))
bug.sety(-100)
bug.color('green')
info = f'亲爱的朋友,你好,\n将对你进行一些小调查。\n'
info = info + f'本次调查共有{len(questions)}题,\n请认真在复选框中进行选择。\n按空格键开始答题。'
bug.write(info,align='center',font=('新宋体',14,'normal'))

spacekey = Key('space')
screen.listen()
while not spacekey.down():screen.update()


以下代码省略......


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, tkinter, turtle | Python问卷调查器已关闭评论

Python简易记事本原形程序

"""
   简易记事本原形程序(主菜单),本程序不需要重定义Root,直接给窗口添加菜单,
"""

from sprites import *
from tkinter.scrolledtext import ScrolledText

screen = Screen()
screen.resizable()
root = screen._root
root._canvas.pack_forget()    # 把屏幕画布给隐藏了
root.config(bg='#00ffff')     # 这是TK窗口的背景颜色了

# 创建一个顶级菜单
menubar = TK.Menu(root)
 
# 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
filemenu = TK.Menu(menubar, tearoff=False)
filemenu.add_command(label="打开", command=lambda:showinfo('hi',''))
filemenu.add_command(label="保存", command=lambda:showinfo('hi',''))
filemenu.add_separator()
filemenu.add_command(label="关于", command=lambda:showinfo('www.lixingqiu.com','本程序基于Python海龟画图'))
filemenu.add_command(label="退出", command=lambda:root.destroy())
menubar.add_cascade(label="文件", menu=filemenu)
 
# 创建另一个下拉菜单“编辑”,然后将它添加到顶级菜单中
editmenu = TK.Menu(menubar, tearoff=False)
editmenu.add_command(label="剪切", command=lambda:showinfo('hi',''))
editmenu.add_command(label="拷贝", command=lambda:showinfo('hi',''))
editmenu.add_command(label="粘贴", command=lambda:showinfo('hi',''))
menubar.add_cascade(label="编辑", menu=editmenu)
 
# 显示菜单
root.config(menu=menubar)

stext2 = ScrolledText(master=root,bg='white',font=('新宋体',12,'normal'))
stext2.tag_configure("sel", background="skyblue")                   # 选择的时候为天蓝色
stext2.configure(undo=True,autoseparators=True, maxundo=-1)         # 让撤销发生作用
stext2.pack(expand=1,fill='both')
stext2.insert(TK.END, '风火轮编程')

# 给stext2加右键菜单
popup_stext2 = TK.Menu(screen._root, tearoff=0)
popup_stext2.add_command(label="撤销 Undo",accelerator="Ctrl+Z",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_command(label="重做 Redo",accelerator="Ctrl+Y",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_separator()
popup_stext2.add_command(label="复制 Copy",accelerator="Ctrl+C",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_command(label="剪切 Cut",accelerator="Ctrl+X",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_command(label="粘贴 Paste",accelerator="Ctrl+V",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_separator()
popup_stext2.add_command(label="全选 Select All",accelerator="Ctrl+A",command=lambda: stext2.event_generate("<>"))
popup_stext2.add_command(label="清空",command=lambda: stext2.delete('1.0', TK.END) )
popup_stext2.add_command(label="打开主页",command=lambda:os.system('explorer https://www.lixingqiu.com'))

def do_popup_stext2(event):
    # 显示stext2的右键菜单
    try:
        popup_stext2.tk_popup(event.x_root, event.y_root+10, 0)
    finally:        
        popup_stext2.grab_release()

stext2.bind("", do_popup_stext2)

screen.mainloop()

发表在 python, sprites, turtle | Python简易记事本原形程序已关闭评论

闪电侠接金币_精灵版

"""
  闪电侠接金币_精灵版,本人曾用pygame和scratch做过这个游戏,
  这次重新用sprites模块做一次
  本程序借用了pygame的混音器,所以需要安装有pygame的支持。
   
"""
from sprites import *
from pygame import mixer

__author__ = '李兴球'
__blog__ = 'www.lixingqiu.com'

width,height = 480,360
screen = Screen()
screen.setup(width,height)
screen.bgpic('res/starspace.png')
screen.title('闪电侠接金币_精灵版,微信号scratch8,by 李兴球')

mixer.init()
coinsound = mixer.Sound('audios/collect.wav')

# 地球从小到大,透明度增加
earth = Sprite(shape='res/地球.png',visible=False,pos=(-1000,0))
earth.scale(0.01)
earth.play('audios/The Flash Theme Song.wav',loop=True)
earth.home()
earth.show()
for k in range(1,90):
    earth.scale(k/100)
    earth.setalpha(150-k)
    earth.wait(0.01)
earth.hide()

# 三个动画序幕
prelude1 = [f'res/sheldon_flash-{i}.png' for i in range(36)]
prelude2 = [f'res/tenor两个-{i}.png' for i in range(18)]
prelude3 = [f'res/timg一个-{i}.png' for i in range(40)]
dummy = Sprite(visible=False,shape='blank')
dummy.show()
for frame in prelude1:
    dummy.shape(frame)
    dummy.wait(0.1)
for frame in prelude2:
    dummy.shape(frame)
    dummy.wait(0.1)
for frame in prelude3:
    dummy.shape(frame)
    dummy.wait(0.1)
dummy.wait(1)
for k in range(90,1,-10):
    dummy.scale(k/100)
    dummy.right(45)
    dummy.wait(0.1)
dummy.setheading(0)
dummy.shape('闪电侠接金币封面.png')
for k in range(1,101,5):
    dummy.scale(k/100)
    dummy.left(45)
    dummy.wait(0.01)
# 是倒过来的,等待2秒自动反转
dummy.wait(2)
for _ in range(4):
    dummy.left(45)
    dummy.wait(0.01)

spacekey = Key("space")
screen.listen()
while not spacekey.down():screen.update()
screen.bgpic('res/longbg.png')
for k in range(90,1,-10):
    dummy.scale(k/100)
    dummy.right(45)
    dummy.wait(0.1)
dummy.hide()
screen.bgpic('res/longbg.png')
im1 = [f"im1/flash{i}.png" for i in range(1,4)]

flashman = Sprite(shape=im1)
flashman.rotatemode(1)

running = True
def alt_costume():
    flashman.nextcostume()
    screen.ontimer(alt_costume,50)
alt_costume()

def alt_bg():
    screen.move(-100,0)
    if screen.xcor() < -240:
        screen.setx(240)
    if running :
        screen.ontimer(alt_bg,50)
    else:
        screen.setx(0)
alt_bg()

coin_frames = [f'coin/{i}.png' for i in range(8)]
coins = Group(tag='coin')
for _ in range(10):
    x = random.randint(2*width,4*width)
    y = random.randint(-height//2,height//2)
    c = Sprite(shape=coin_frames,pos=(x,y),tag='coin')
    c.scale(0.3)
    
score = 0
clock = Clock()

以下代码省略......

    

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 闪电侠接金币_精灵版已关闭评论

右键菜单

"""
   右键菜单,本程序演示如何使用tkinter的右键菜单,
   本程序用Python精灵模块开发,需要先在cmd下用命令:
   pip install sprites进行安装。
"""

from sprites import *

screen = Screen()
screen.colormode(255)
screen.setup(480,360)
screen.title('右键菜单')

def backgroundcolor():
    """设定背景颜色"""    
    c = askcolor()
    if c[0]!=None:
        color = list(c[0])
        color1 = [int(c) for c in color]
        color2 = [str(int(c)) for c in color]
        screen.bgcolor(color1)
        
# 下面的TK是就是tkinter
popup = TK.Menu(screen._root, tearoff=0)
popup.add_command(label="bgcolor(背景颜色)" ,command=backgroundcolor)
popup.add_separator()
popup.add_command(label="关于本程序",command=lambda:showinfo('关于','本程序由李兴球开发\n\nQQ:406273900\n\nwww.lixingqiu.com'))
popup.add_command(label="打开主页",command=lambda:os.system('explorer https://www.lixingqiu.com'))
popup.add_command(label="退出本程序",command=lambda:screen.bye())


以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, tkinter, turtle | 右键菜单已关闭评论

主菜单制作

"""
   主菜单制作,本程序重定义_Root类的__init__,增加了createmenu方法,
   关于Root类,请查看turtle.py文件.
   本程序用Python精灵模块开发,需要先在cmd下用命令:
   pip install sprites进行安装。
"""

from sprites import *
from turtle import _Root,ScrolledCanvas
from tkinter.scrolledtext import ScrolledText

# 下面的TK即是tkinter ,从sprites已经导入。
def root__init(self):
    TK.Tk.__init__(self)       # 新建窗口
    # 这个做为背景框架
    self.frame_bg = TK.Frame(self,bg='#e2a2e5',padx=8,pady=8)
    self.frame_bg.pack(expand=1,fill='both')
    
    self.frame_left = TK.Frame(self.frame_bg,bg='#3200f0',padx=8,pady=8)
    self.frame_left.pack(side=TK.LEFT,expand=1,fill='both')
    
    self.frame_right = TK.Frame(self.frame_bg,bg='#00e200',padx=8,pady=8)
    self.frame_right.pack(side=TK.RIGHT,expand=1,fill='both')    

    self.createmenu()    

def root_createmenu(self):
        
    # 创建一个顶级菜单
    menubar = TK.Menu(self)
     
    # 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
    filemenu = TK.Menu(menubar, tearoff=False)
    filemenu.add_command(label="打开", command=lambda:showinfo('hi',''))
    filemenu.add_command(label="保存", command=lambda:showinfo('hi',''))
    filemenu.add_separator()
    filemenu.add_command(label="退出", command=lambda:self.destroy())
    menubar.add_cascade(label="文件", menu=filemenu)
     
    # 创建另一个下拉菜单“编辑”,然后将它添加到顶级菜单中
    editmenu = TK.Menu(menubar, tearoff=False)
    editmenu.add_command(label="剪切", command=lambda:showinfo('hi',''))
    editmenu.add_command(label="拷贝", command=lambda:showinfo('hi',''))
    editmenu.add_command(label="粘贴", command=lambda:showinfo('hi',''))
    menubar.add_cascade(label="编辑", menu=editmenu)
     
    # 显示菜单
    self.config(menu=menubar)

def root_setupcanvas(self,width,height,cwidth,cheight):
    """设置画布"""
    self._canvas = ScrolledCanvas(self.frame_left, width, height, cwidth, cheight)
    self._canvas.pack(expand=1, fill="both")

# 重定义_Root类的初始化方法和setupcanvas方法,增加了createmenu方法以便添加菜单
_Root.createmenu = root_createmenu
_Root.__init__ = root__init
_Root.setupcanvas = root_setupcanvas

screen = Screen()
screen.setup(960,640)
root = screen._root
screen.title('主菜单制作 by 李兴球  www.lixingqiu.com')

cat = Sprite(2)

b0 = TK.Button(root.frame_left,text='风火轮编程',command=lambda:cat.bk(10))
b0.pack()

codetext = ScrolledText(master=root.frame_left,bg='white',
                     font=('新宋体',12,'normal'),width=40,height=0)
codetext.tag_configure("sel", background="skyblue")                   # 选择的时候为天蓝色
codetext.configure(undo=True,autoseparators=True, maxundo=-1)         # 让撤销发生作用
codetext.pack(expand=1, fill="both")
codetext.insert(TK.END, 'from turtle import *')

b1 = TK.Button(root.frame_right,text='右测试按钮',command=lambda:cat.fd(10))
b1.pack()

screen.mainloop()

发表在 python, sprites, tkinter, turtle | 主菜单制作已关闭评论

窗口分区原理程序

"""
   窗口分区原理程序,本程序重定义_Root类的__init__,让窗口分为四个区。
   本程序用Python精灵模块开发,需要先在cmd下用命令:
   pip install sprites进行安装。
"""

from sprites import *
from turtle import _Root,ScrolledCanvas
from tkinter.scrolledtext import ScrolledText
# 下面的TK即是tkinter ,从sprites已经导入。
def root__init(self):
    TK.Tk.__init__(self)       # 新建窗口
    # 这个做为背景框架
    self.frame_bg = TK.Frame(self,bg='#e2a2e5',padx=8,pady=8)
    self.frame_bg.pack(expand=1,fill='both')
    
    self.frame_left = TK.Frame(self.frame_bg,bg='#e20000',padx=8,pady=8,height=360,width=480)
    self.frame_left.pack(side=TK.LEFT,expand=1,fill='both')
    
    self.frame_right = TK.Frame(self.frame_bg,bg='#00e200',padx=8,pady=8)
    self.frame_right.pack(side=TK.RIGHT,expand=1,fill='both')
    
    self.frame_centertop = TK.Frame(self.frame_bg,bg='#0000e2',padx=8,pady=8)
    self.frame_centertop.pack(side=TK.TOP,expand=1,fill='both')
    
    self.frame_centerbottom = TK.Frame(self.frame_bg,bg='#433440',padx=8,pady=8)
    self.frame_centerbottom.pack(side=TK.BOTTOM,expand=1,fill='both')
    
def root_setupcanvas(self,width,height,cwidth,cheight):
    self._canvas = ScrolledCanvas(self.frame_left, width, height, cwidth, cheight)
    self._canvas.pack(expand=1, fill="both")

# 重定义_Root类的初始化方法和setupcanvas方法,具体定义请查看turtle.py
_Root.__init__ = root__init
_Root.setupcanvas = root_setupcanvas

screen = Screen()
screen.setup(960,640)
root = screen._root
screen.title('屏幕分区 by 李兴球  www.lixingqiu.com')

cat = Sprite(2)

b0 = TK.Button(root.frame_left,text='左区测试按钮\n风火轮编程',command=lambda:cat.bk(10))
b0.pack()

codetext = ScrolledText(master=root.frame_left,bg='white',
                     font=('新宋体',12,'normal'),width=40,height=0)
codetext.tag_configure("sel", background="skyblue")                   # 选择的时候为天蓝色
codetext.configure(undo=True,autoseparators=True, maxundo=-1)         # 让撤销发生作用
codetext.pack()
codetext.insert(TK.END, 'from turtle import *')

b1 = TK.Button(root.frame_right,text='右测试按钮',command=lambda:cat.fd(10))
b1.pack()

b2 = TK.Button(root.frame_centertop,text='中上区测试按钮',command=lambda:showinfo('中上',''))
b2.pack()

b3 = TK.Button(root.frame_centerbottom,text='中下区测试按钮',command=lambda:showinfo('中下',''))
b3.pack()

screen.mainloop()

发表在 python, sprites, tkinter, turtle | 窗口分区原理程序已关闭评论

在for及while循环中插入中断指令

这是有Python语法分析的一个例子。在开发一个小软件中要用到。

def countspaces(string):
    """统计string前面的空格数"""
    spaces = 0
    for char in string:      # 
        if char !=' ':break
        if char == ' ':spaces += 1
    return spaces
                
def insertbreak(programes,breakstatement):
    """
       给循环增加中断指令,以便按中止时循环会退出
       programes:代码列表,breakstatement:中断指令,
       只支持空格为缩进的代码!!

    """
    index = 0
    amounts = len(programes)
    while index < amounts:    
        code = programes[index]
        tmpcode = code.strip()
        if tmpcode.startswith('while') or tmpcode.startswith('for') and ":" in tmpcode:
        
            # 检测在冒号后是否有语句,如果有,则移到下一行
            singleline = code.split(":")
            #aftercolon = singleline[-1].strip()  
            aftercolon = ":".join(singleline[1:])
            aftercolon = aftercolon.strip()        # 冒号后去除两边空格字符串
            if len(aftercolon)>0:                  # 如果冒号后有语句
              if not aftercolon.startswith("#"):   # 如果不是#号开头则认为是一条语句
                  programes[index] = singleline[0] + ":" # 冒号前面的代码
                  # 统计singleline[0]前面的空格数
                  spaces = countspaces(singleline[0]) + 4 # 加4表示要缩进
                  insertedcode = spaces * " " + breakstatement
                  programes.insert(index+1,insertedcode)
                  index = index + 1
                  # 把冒号后面的代码插下到列表的下一项,后面代码的依次往后移
                  programes.insert(index+1,spaces * " " + aftercolon)
                  index = index + 1                  
              else:
                   # 否则在冒号后只是注释,则直接在while或for循环下面插入一条中断 
                   spaces = countspaces(programes[index+1])# 统计for或while下一行代码前面空格数
                   insertedcode = spaces * " " + breakstatement
                   programes.insert(index+1,insertedcode)
                   index = index + 1
              amounts = len(programes)
                   
            else:
               # 否则在冒号后并没有语句,则直接在while或for循环下面插入一条中断 
               spaces = countspaces(programes[index+1])# 统计for或while下一行代码前面空格数
               insertedcode = spaces * " " + breakstatement
               programes.insert(index+1,insertedcode)
               index = index + 1
               amounts = len(programes)
        index = index + 1

allcodes = """
for y in range(3):
a='for x in range(1000):print(abcd);break'
s = 'while x>3: pass'
y = 0
for x in zip(abcd,efg):#这是for循环呀
  for x in range(4):print(x,end='')
  while True:
      import os
      for _ in range(10):
         for x in range(10000000000000):
           bug.fd(10)
           bug.rt(10)
         for y in range(acd):
            pass
       while True:   # 哟西这是一个while循环呢
            pass
            for _ in range(100):
                   pass
                   while True:pass
       for x in 'abcdefg':    # THis is a test
           print('x')
           print('为了我国的')
       while True:for _ in range(10):print(10) 
"""
allcodes = allcodes.split("\n")
stopcode = 'if stopexec == True:break'

insertbreak(allcodes,stopcode)
临时 = '\n'.join(allcodes)
f = open('c:/abcd.py',mode='w',encoding='utf-8')
f.write(临时)
f.close()
print(临时)

发表在 python | 在for及while循环中插入中断指令已关闭评论

猫捉老鼠数学运算演示

"""
   猫捉老鼠数学演示。
   猫在老鼠30米之远处发现了老鼠,现在老鼠要逃跑。猫一跳为2.5米,老鼠一跳1.2米。
   但在相同时间内,猫跳3次而老鼠能跑5次,求猫需要多少时间单位才能捉住老鼠。
   本程序演示了上面所说的这个过程。
"""
from sprites import *

distance = []
t = 0
startx = -200
cat_dist = startx +  t * 3 * 2.5
mouse_dist = startx + t * 5 * 1.2 + 30
distance.append((cat_dist,mouse_dist))
while cat_dist != mouse_dist:
    t += 1                                # 增加一个单位时间
    cat_dist = startx +  t * 3 * 2.5      # 算猫到起点的距离
    mouse_dist = startx + t * 5 * 1.2 + 30# 算鼠到起点的距离
    distance.append((cat_dist,mouse_dist))# 加入列表

screen = Screen()
screen.setup(480,200)

s = Sprite(visible=False)                 # 画线条的角色
s.bk(200)
s.dot(5,'red')
s.pendown()
s.fd(300)
s.penup()

cat = Sprite('res/cat1.png')              # 猫
mouse = Sprite('res/rat1.png')            # 老鼠 
cat.scale(0.5)
mouse.scale(0.5)


以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 猫捉老鼠数学运算演示已关闭评论

蒙特卡洛算圆周率演示

"""
   蒙特卡洛方法动画演示,本例在正方形内打点,圆周率的值为
   扇区内点数除以总共点数的积再乘以4。关于什么是蒙特卡洛,请自行百度。
"""
from sprites import *

screen = Screen()

s = Sprite()
s.draw_grid2(1,1,500,500)
s.sety(280)
ft = ('楷体',22,'normal')
ft2 = ('新宋体',16,'normal')
s.write('蒙特卡洛算圆周率演示',align='center',font=ft)
s.sety(250)
s.write('单击鼠标左键中止',align='center',font=ft2)

s.goto(250,-250)
s.left(90)
s.pendown()
s.circle(500,90)
s.hide()
s.penup()
left,bottom = -250,-250
counter = 0
r = 0
def breakdot(x,y):
    global running
    running = False
screen.onclick(breakdot)            # 单击中断循环
running = True
while running :

以下代码省略......



下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 蒙特卡洛算圆周率演示已关闭评论

幽默的服务员算法演示

"""
某宾馆有100个房间,从1到100编了号,第一个服务员来了,他把所有的房门都打开。
第二个服务员来了,他把所有编号是2的倍数作相反处理(即原来关上的打开,原来打开的关上。)
第三个服务员把所有编号是3的倍数的房间也做相反处理。以后,第4、5一直到第100号服务员也
都是把自己编号倍数的房间做相反处理。问第100个服务员走过以后,有哪几扇门是开着的。
"""

from sprites import *

doorsimage = ['close.png','open.png']
rows = 10
cols = 10
length = 50
# 画10x10,长宽各为50的格子图,返回中心点坐标到cors
cors = Sprite(visible=False).draw_grid2(rows,cols,length,length)

doors = []                   # 装每个角色的列表
for rows in cors:
    for cor in rows:
        s = Sprite(shape=doorsimage,pos=cor)
        doors.append(s)
        time.sleep(0.01)

rooms = [ index for index in range(1,101) ]
# 下面的rooms中的键是房间编号,值代表房间开合状态,False代表关,True代表开
rooms = {}.fromkeys(rooms,False)

dummy = Sprite(visible=False)
dummy.addy(260)


以下代码省略......
    

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 幽默的服务员算法演示已关闭评论

draw_grid2方法演示

"""
   draw_grid2演示,本程序会画一个4X4的格子,然后小虫子会在每个格子中心点打蓝点。
"""

from sprites import *               # 从精灵模块导入所有命令 

s = Sprite()                        # 新建一个角色
s.wait(3)
cors = s.draw_grid2(4,4,100,100)    # 画4X4格子,长宽都是100
for rows in cors:                   # 每一行的坐标
    for xy in rows:                # 行中的每一个坐标
        s.goto(xy)                  # 角色达到坐标点
        s.dot(10,'blue')            # 角色打蓝点
        s.wait(0.1)                 # 等待0.1秒
    s.home()                        # 回到中心点

s.screen.mainloop()

发表在 python, sprites, turtle | draw_grid2方法演示已关闭评论

瞎猫走方格

"""
   瞎猫走方格,
   本程序画了一个10X10的宽高为50的格子,
   然后瞎猫随机选择一个方向,直到走出格子,如此重复。
"""
from sprites import *

rows = 10
cols = 10
length = 50
# 行数,列数,格子宽度,格子高度,返回每个格子中心点坐标
Sprite(visible=False).draw_grid2(rows,cols,length,length)

cat = Sprite(2)
cat.width(4)
cat.scale(0.5)
cat.color('red')
while True:
    running = True
    cat.clear()    
    cat.home()
    cat.pendown()

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 瞎猫走方格已关闭评论

跳马问题算法答案演示

"""
   跳马问题算法
"""
from sprites import * 

grid_width  = 50       # 格子宽度
grid_height = 40       # 格子高度
rows = 4               # 表示行数
cols = 8               # 表示列数
chess_width = grid_width * cols
chess_height = grid_height * rows

screen = Screen()      # 新建屏幕
screen.setup(600,480)
screen.title('跳马问题算法答案演示by李兴球')

s = Sprite(visible=False)
s.draw_grid2(rows,cols,grid_width,grid_height)
left,bottom = -chess_width/2,-chess_height/2
cors = []              # 每个顶点的坐标
for r in range(rows+1):
    rcors = []
    for c in range(cols+1):
        x = left + c * grid_width
        y = bottom + r * grid_height
        rcors.append((x,y))
    cors.append(rcors)
jack  = Sprite(visible=False)
ft = ('黑体',20,'bold')
jack.addy(150)
jack.write("跳马问题算法答案演示",align='center',font=ft)
tom = Sprite(shape='res/马.png')
def output(points):
    tom.clear()
    tom.show()
    for p in points:
        i,j = p
        pos = cors[j][i]
        tom.goto(pos)
        tom.pendown()
        tom.dot(10,'magenta')
        tom.wait(0.1)
    tom.penup()
    tom.stamp()
    tom.hide()
    tom.goto(0,-150)
    tom.write(str(points),align='center')
    tom.wait(1)
    
grids = [ ]
for r in range(rows+1):
    grids.append([0 for i in range(cols+1)])

def outofrange(a,b):
    """是否超出范围"""
    return a > cols or b > rows or a <0 or b<0
    
x = 0
y = 0
points = [(0,0)]                         # 记录路径的
grids[0][0] = 1                          # 标记第一个点 
condition = [(1,2),(2,1),(2,-1),(1,-2)]  # 4个试探运算
records = {(0,0):-1}                     # 记录当前点已经试探过的运算 
running = True
while running:   
    # 开始试探
    if (x,y) in records:             # 如果有此键说明在此点试探过
        start = records[(x,y)]
        if start == 3 :              # 此点全部试完了,则回溯
            x,y = points.pop()
            grids[y][x] = 0          # 把此点标记为0
            records[(x,y)] = -1      # 记录此点以后需要全部测试4个方向
            if points == []:
                running = False
            else:
                x,y = points[-1]     # 从这个点重新开始
    else:
        start = -1

    for index in range(start+1,4):
        records[(x,y)] = index       # 记录此点的运算已经试探过了
        dx,dy = condition[index]
        nextx = x + dx
        nexty = y + dy        
        if outofrange(nextx,nexty):continue
        elif nextx < cols and nexty <= rows:
            grids[nexty][nextx] = 1
            points.append((nextx,nexty))
            x = nextx
            y = nexty
            break
        elif nextx == cols:
            grids[nexty][nextx] = 1
            points.append((nextx,nexty))
            if nexty == rows:  output(points)  # 到达了右上角,可输出这个路径了
            # 回溯到上一个点
            x,y = points.pop()
            grids[y][x] = 0
            records[(x,y)] = -1
            if points == []:
                running = False
            else:
                x,y = points[-1]
    
    

发表在 python, sprites, turtle | 跳马问题算法答案演示已关闭评论

python八皇后问题92种解决方案动态演示

python八皇后问题92种解决方案动态演示

python八皇后问题92种解决方案动态演示

"""
   八皇后问题动态演示_图章版。本程序演示了八皇后问题的92种解决方案。

"""
from sprites import *

width,height = 400,400
screen = Screen()
screen.title('python八皇后问题92种解决方案动态演示by李兴球')

ft = ('黑体',18,'bold')
ft2 = ('新宋体',12,'normal')
tom = Sprite(visible=False)          # 负责画格子与显示标题信息的
tom.color('magenta')
tom.addy(250)
tom.write("八皇后问题动态演示",align='center',font=ft)
tom.addy(-30)
tom.color('blue')
tom.write("本程序由Python精灵模块开发",align='center',font=ft2)
tom.home()
cors = tom.draw_grid2(8,8,50,50)     # 画8x8,长宽为50的格子图
tom.shape('res/black.png')
# 下面是画黑白相间的格子
c = 0
for rows in cors:
    index = c % 2
    for xy in rows:
        tom.goto(xy)
        if index % 2 == 0 :tom.stamp()
        index += 1
    c = c + 1
jack = Sprite('res/queen.png')

rose = Sprite(visible=False)         # 负责显示一种输出结果的
rose.sety(-250)
rose.font = ('楷体',24,'bold')
rose.color('red')

def have_conflict(x,y):
    """ 检测同列,斜线上有没有值为1的"""
    for r in range(x):   # 同列,不超过第x行,因为下面的没必要检测         
        if grids[r][y] == 1 :return True
    # 左上斜检测
    r = x
    c = y
    while True:
        r = r-1
        c = c-1
        if r < 0 or c < 0 :break
        if grids[r][c] == 1 : return True

    # 右上斜检测
    r = x
    c = y
    while True:
        r = r-1
        c = c+1
        if r < 0  or c > 7  :break
        if grids[r][c] == 1 : return True
    
def output():
    s = ''
    for r in grids:       # 每一行
        for c in r:       # 每行中的每个数           
            if c == 1 :
               s = s + str(r.index(c))
               print(r.index(c),end='')
    print()
    rose.clear()
    info = f'第{counter+1}种解决方案:{s}'
    rose.write(info,align='center',font=rose.font)    
        
        
grids = [[0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)],
         [0 for i in range(8)]]
x = 0                             # x表示行
y = 0                             # y表示列
counter = 0
# 键是(x,y),值是图章编号的字典
stampdict = {}                      # 保存对应坐标图章编号的字典
cleardelay = 0.005                  # 清除等待时间
setdelay = 0.005                    # 放置皇后,等待时间
resultdelay = 5                     # 找到一种结果后的等待时间
while True: 
    while y < 8:                  # 每一列都不行,则回溯到上一行
        
        if have_conflict(x,y):    # 有冲突则下一列
            y = y + 1
        else:
            grids[x][y] = 1       # 否则这里放1,表示放皇后            
            jack.goto(cors[x][y])
            stampdict[(x,y)] = jack.stamp() # 保存图章编号
            jack.wait(setdelay)
            if x == 7 :           # 说明有了一个解了
                print('结果',end='')
                output()           # 输出这种结果
                
                jack.wait(resultdelay)
                counter += 1       # 计下数
                grids[x][y] = 0    # 清掉以便尝试下一列
                jack.goto(cors[x][y])
                jack.clearstamp(stampdict[(x,y)]) # 清除这个图章编号
                jack.wait(cleardelay)
                
                y = y + 1          # 尝试下一列,向右移尝试
            else:
                x = x + 1          # 下一行
                y = 0              #  从0列开始
            
    # 如果所有的y位置都不行,回到上一行
    x = x - 1
    if x == -1 :break
    # 寻找上一行的y
    for i in range(8):
        if grids[x][i] == 1:
            grids[x][i] = 0     # 清除这种
            jack.goto(cors[x][i])
            jack.clearstamp(stampdict[(x,i)])
            jack.wait(cleardelay)
            y = i + 1           # 如果刚好又是8会继续回到上一行
            break
    
        

发表在 python, sprites, turtle | python八皇后问题92种解决方案动态演示已关闭评论

奥特曼打怪兽射击游戏

"""
   奥特曼打怪兽射击游戏,本程序需要pygame的混音器支持,所以需要安装pygame模块才能正常运行。
   游戏操作方法:用鼠标指针牵引奥特曼,单击左键射击,碰到怪兽奥特曼死亡,杀死100个游戏成功结束。
   
   
"""
from sprites import *
from pygame import mixer

width,height = 800,600
screen = Screen()
screen.setup(width,height)
screen.bgcolor('black')
screen.title('奥特曼打怪兽by 李兴球')

mixer.init()
shootsound = mixer.Sound('audio/CANNON3.wav')
deadsound = mixer.Sound('audio/ORCHCYM.wav')
thudsound = mixer.Sound('audio/THUD.wav')

title = "奥特曼打怪兽"
helpinfo = '目标,打死100只怪兽'
txt2image(title,'res/title.png',fontsize=32,color=(0,255,255))
txt2image(helpinfo,'res/target.png',fontsize=20,color=(255,255,10))

game_title = Sprite(shape='res/title.png',pos=(0,260),visible=False)
game_title.stamp(10)                   # 10秒后图章自动消失
game_title.addy(-34)                   # 下移34像素
game_title.shape('res/target.png')
game_title.stamp(10)                   # 10秒后图章自动消失

frames = [f"frames/{i:04d}.png" for i in range(23)]
cover = Sprite(shape=frames)           # 封面角色
cover.addy(-20)
# 循环播放背景音乐
cover.play('纯音乐 - 迪迦奥特曼主题曲.mp3.wav',loop=True)
for _ in frames:
    cover.nextcostume()
    cover.wait(0.15)
for s in range(10,1,-1):
    cover.scale(s/100)
    cover.right(30)
    cover.wait(0.01)
ultraman = cover
ultraman.dead = False                  # 描述奥特曼没死
ultraman.scale(1)
ultraman.shape('res/奥特曼.png')

explosions = ['res/explosion0.png','res/explosion1.png']
costumes = ['res/fantasy7.png','res/ghoul-b.png','res/knight1.png',
            'res/monster1-a.png','res/robot1.png','res/wild1.png','res/witch.png']

monsters = Group('monster')             # 怪物组
[Sprite(shape=random.choice(costumes),tag='monster',visible=False) for _ in range(15)]

def init_monster(m):
    x = random.randint(-1000,1000)
    y = random.randint(-1000,1000)
    while ultraman.distance(x,y) < 400:
        x = random.randint(-1000,1000)
        y = random.randint(-1000,1000)
    m.goto(x,y)
    m.movetimes = 0            
    m.heading(ultraman)
    m.show()
            
[init_monster(m) for m in monsters]
    
bullet = Sprite('res/火png.png',visible=False)
bullet.speed = 0

counter = 0                             # 计数器
leftkey = Mouse(1)                      # 鼠标左键
clock = Clock()
success  = None                         # None,False与True
running = True

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 奥特曼打怪兽射击游戏已关闭评论

美人鱼与猫

"""
   美人鱼与猫,这是一个动画,美人鱼从水底游出,看见小猫,希望小猫能和她一起游泳。
   
"""
from sprites import *

screen = Screen()           # 新建屏幕
screen.resizable()
screen.setup(480,360)       # 设定宽高
screen.title('美人鱼与猫by lixingqiu')
screen.bgpic('res/Underwater 1.png')

frames = ['res/mermaid-a.png','res/mermaid-b.png',
          'res/mermaid-c.png','res/mermaid-d.png']

girl = Sprite(shape=frames,pos=(-400,-400))
girl.stop = False           # 描述是否要切换造型的
def alt_costume():
    girl.nextcostume()
    if girl.stop == False:
       screen.ontimer(alt_costume,200)
    else:
       girl.shape('res/mermaid-b.png')
alt_costume()
    
girl.slide((400,400))
girl.hide()                 # 隐藏起来
girl.goto(-400,-400)
girl.scale(0.5)             # 一半大小
girl.show()                 # 显示出来 
screen.bgpic('res/Pool.png')
girl.slide((0,-100))
girl.stop = True

# 小猫出现
cats = [f"cats/{i}.png" for i in range(16)]
cat = Sprite(shape=cats,visible=False,pos=(300,0))
cat.scale(0.1)
cat.rotatemode(1)
cat.right(180)
cat.show()
cat.play('喵.wav')

以下代码省略......


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 美人鱼与猫已关闭评论

太空虫子

"""
   太空虫子。
   太空外星害虫来袭,小虫子被赋予光荣任务去消灭它们。
   可是它没有武器,只有去撞死它们。
   请按上下左右方向箭头,消灭所有害虫!
   
"""

from sprites import *

width,height = 600,760
screen = Screen()               # 新建屏幕
screen.setup(width,height)      # 屏幕宽高
screen.bgcolor('black')         # 背景颜色
screen.title('太空虫子_by www.lixingqiu.com')

# 铺设星空背景
star = Sprite(shape='star',visible=False)
star.color('white')             # 星星为白色
for _ in range(50):
    star.gotorandom()
    star.scale(max(0.01,random.random()/10))
    star.stamp()                # 星星盖图章
 
pest_group = Group('pest')      # 新建所有害虫组
rows = 8                        # 行数 
cols = 8                        # 列数 
startx = -200                   # 起始x坐标
starty = 300                    # 起始y坐标
for r in range(rows):           # 迭代rows
    for c in range(cols):       # 迭代cols
        x = startx + c * 60     # 形成x坐标
        y = starty - r * 40     # 形成y坐标
        p = Sprite(shape='res/pest.png',pos=(x,y),tag='pest')
        p.dy = 0                # 垂直速度为0   
        p.da = 0                # 加速度为-0.5

# 新建木条,作为虫子的托盘   
woodbar = Sprite('res/woodbar.png',pos=(0,-320))

bug = Sprite(pos=(0,-200))      # 新建虫子
bug.left(90)                    # 左转90度
bug.dx = 0                      # 水平速度
bug.dy = 0                      # 垂直速度

leftkey = Key("Left")           # 实例化左方向箭头
rightkey = Key("Right")         # 实例化右方向箭头
upkey = Key("Up")               # 实例化上方向箭头
downkey = Key("Down")           # 实例化下方向箭头

screen.listen()
clock = Clock()                 # 新建时钟对象

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 太空虫子已关闭评论

彩色螺旋图+填充正方形

"""
   彩色螺旋图+填充正方形.py
"""
from turtle import *

cs = ['red','orange','yellow','green',
      'cyan','blue','purple','pink']   #  定义颜色表

screen = Screen()            # 新建屏幕 
screen.bgcolor('black')      # 背景图黑

tom = Turtle(shape='turtle') # 新建形状为turtle的海龟对象
tom.shapesize(3,3)           # 在横向和纵向都扩大为3倍大小

tom.fillcolor('red')         # 填充颜色
tom.pensize(5)               # 画笔粗细,别名width

for x in range(360):
    tom.pencolor(cs[x%7])    # 画笔颜色
    tom.fd(x/10)
    tom.rt(14)

# 下面演示填充命令的用法,它们是一对命令
# 在画图之前用begin_fill
# 画完之后用end_fill,这样就能用设定的fillcolor
# 填充一个图形了
tom.begin_fill()             # 开始填充
for x in range(4):
    tom.fd(100)
    tom.left(90)
tom.end_fill()               # 结束填充

screen.mainloop()            # 进入主循环,不断自动刷新屏幕
    


发表在 python, turtle | 彩色螺旋图+填充正方形已关闭评论

音乐跳舞毯模拟

python音乐跳舞毯模拟

python音乐跳舞毯模拟

"""
   音乐跳舞毯模拟,当箭头滑过中间的箭头时,按相应的方向箭头即可加分。
   本程序也演示了如何播放多首背景音乐。
   注意音乐文件名下划线中的数字是时长,这时预先查看到设故意设成这样的。
   也可以用相关模块的命令读出wav的时长。
   由于借用了pygame的混音器,所以本程序正常运行还要安装pygame模块。
   共有8首背景音乐,2个声音效果。声音播放用了winsound模块的PlaySound命令(sprites模块封装)
   和pygame模块的混音器功能。
"""
from sprites import *                             # 从精灵模块导入所有命令
from pygame import mixer                          # 从pygame模块导入混音器

mixer.init()                                      # 初始化混音器
soundeffect = mixer.Sound('fairydust.wav')        # 实例化音频对象

Sprite(visible=False).play('dance celebrate.wav') # 封面时的音效
screen = Screen()
screen.setup(480,360)
screen.bgpic('res/cover.png')   
spacekey = Key('space')                           # 空格键
mouseleftkey = Mouse(1)                           # 鼠标左键
screen.listen()
while not (mouseleftkey.down() or  spacekey.down()):
    screen.update()   

screen.bgpic('res/stage-kiss.png')

arrowpng = 'res/绿箭头.png'
# 下面是用于碰撞的箭头,可以把它们设为完全透明
rightarrow = Sprite(shape=arrowpng,pos=(90,0))
leftarrow = Sprite(shape=arrowpng,pos=(-90,0))
leftarrow.right(180)
uparrow = Sprite(shape=arrowpng,pos=(-30,0))
uparrow.left(90)
downarrow = Sprite(shape=arrowpng,pos=(30,0))
downarrow.right(90)

# 下面是移动的箭头
rightarrow2 = Sprite(shape=arrowpng,pos=(90,-180))
leftarrow2 = Sprite(shape=arrowpng,pos=(-90,-280))
leftarrow2.right(180)
uparrow2 = Sprite(shape=arrowpng,pos=(-30,-2000))
uparrow2.left(90)
downarrow2 = Sprite(shape=arrowpng,pos=(30,-1000))
downarrow2.right(90)

score = 0
def rightreleased():
    global score    
    if rightarrow2.collide(rightarrow):
        rightarrow.left(1)
        score += 10
        effect((0,120),'res/add10.png',500)
        soundeffect.play()
def leftreleased():
    global score    
    if leftarrow2.collide(leftarrow):
        leftarrow.left(1)
        score += 10
        effect((0,120),'res/add10.png',500)
        soundeffect.play()
def upreleased():
    global score    
    if uparrow2.collide(uparrow):
        uparrow.left(1)
        score += 10
        effect((0,120),'res/add10.png',500)
        soundeffect.play()
def downreleased():
    global score    
    if downarrow2.collide(downarrow):
        downarrow.left(1)
        score += 10
        effect((0,120),'res/add10.png',500)
        soundeffect.play()
    
screen.onkey(rightreleased,"Right")
screen.onkey(leftreleased,"Left")
screen.onkey(upreleased,"Up")
screen.onkey(downreleased,"Down")

musics = ['music/01_99.wav','music/02_118.wav','music/03_96.wav',
          'music/04_329.wav','music/05_275.wav','music/06_141.wav',
          'music/07_118.wav','music/08_140.wav']
index = 0
m = Sprite(visible=False)
def playmusic():
    global index
    music = musics[index]
    m.play(music)   
    times = music.split('/')[-1].split('.')[0].split('_')[-1]
    times = int(times) * 1000
    index = index + 1
    if index < len(musics):
        screen.ontimer(playmusic,times)
playmusic()                           # 播放多首音乐 

clock = Clock()

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python, sprites, turtle | 音乐跳舞毯模拟已关闭评论

tkinter 对键盘和鼠标事件的处理同样适合于海龟画图

tkinter 对键盘和鼠标事件的处理。由于turtle海龟画图用tkinter开发,所以也适合于Python海龟画图。

鼠标事件

<ButtonPress-n> <Button-n> <n> 鼠标按钮n被按下,n为1左键,2中键,3右键
<ButtonRelease-n> 鼠标按钮n被松开
<Double-Button-n> 鼠标按钮n被双击
<Triple-Button-n> 鼠标按钮n被三击
<Motion> 鼠标被按下,同时,鼠标发生移动
<Bn-Motion> 鼠标按钮n被按下,同时,鼠标发生移动
<Enter> 鼠标进入
<Leave> 鼠标离开
<MouseWheel> 鼠标滚轮滚动

键盘事件

<Any-KeyPress> <KeyPress> <Key> 任意键按下
<KeyRelease> 任意键松开
<KeyPress-key> <Key-key> <key> 特定键按下
<KeyRelease-key> 特定键松开
<Control-Shift-Alt-KeyPress-key> <Control-Shift-Alt-key> 组合键按下(Alt,Shift,Control任选一到三个)
对于大多数的单字符按键,你还可以忽略“<>”符号。但是空格键和尖括号键不能这样做(正确的表示分别为、)

特殊键的键名
<Return>
<Escape>
<space>
<Tab>
<Up>
<Right>
<Left>
<Down>
<Shitf_L>
<Shift_R>
<Control_L>
<Control_R>
<Alt_L>
<Alt_R>
<F1>

<F12>

根据事件,查看按键
event.char 可见字符,甚至中文
event.keysym 用字符串命名了按键
event.keycode 用按键码命名了按键,但是它不能反映事件前缀:Alt、Control、Shift、Lock,并且它不区分大小写写按键,即输入a和A是相同的键码。
event.keysym_num 用数字代码命名了按键
event.Key 描述了键盘上的按键名,方便一一对应

发表在 python, tkinter, turtle | tkinter 对键盘和鼠标事件的处理同样适合于海龟画图已关闭评论

读出自己源码显示在屏幕上

"""
   读出自己,本程序会把本身内容读出来,显示在屏幕上。
"""
from sprites import *

self = sys.argv[0]
f = open(self,encoding='utf-8')  # py的编码为utf-8
source = f.read()
f.close()

tom = Sprite(visible=False)      # 用于write的角色
tom.goto(-250,250)               # 左上角起始坐标

fnt = ('新宋体',14,'normal')     # 新建字体样式
lines = source.split('\n')
for line in lines:
    for char in line:
        tom.write(char,align='center',font=fnt)
        c = len(bytes(char,'gb2312'))       
        tom.addx(10*c)
    tom.setx(-250)
    tom.addy(-20)
    
tom.screen.mainloop()            # 进入主循环

发表在 python, sprites, turtle | 读出自己源码显示在屏幕上已关闭评论

飞扬小鸟Python精灵模块简版

飞扬小鸟Python精灵模块简版

飞扬小鸟Python精灵模块简版

"""
   飞扬小鸟Python精灵模块简版
"""

from sprites import *

width,height = 480,360
bimages = [f'res/costume{i}.png' for i in range(1,5)]

screen = Screen()
screen.setup(width,height)
screen.bgpic('res/背景.png')
screen.title('飞扬小鸟Python精灵模块简版')

leftkey = Mouse(1)                         # 左键

# 循环播放背景音乐
Sprite(visible=False).play('res/音乐.wav',loop=True)

dummy = Sprite(visible=False)
dummy.addy(100)
dummy.write("飞扬小鸟Python精灵模块简版",align='center',font=('楷体',22,'normal'))
dummy.addy(-80)
dummy.write("writed by lixingqiu",align='center',font=('黑体',18,'bold'))
dummy.addy(-100)
dummy.write("click to start the game",align='center',font=('宋体',12,'normal'))

while not leftkey.down():screen.update()
dummy.clear()
# 新建上下管道
up_pip = Sprite('res/上管道.png',pos=(width,height//2))
down_pip = Sprite('res/下管道.png',pos=(width,-height//2))

bird = Sprite(shape=bimages,pos=(-100,0))  # 新建小鸟
bird.dy = 0                                # 垂直速度
bird.die = False                           # 描述死亡
def alt_costume():                         # 切换造型
    bird.nextcostume()                     # 下一个造型
    if bird.die == False:                  # 如果没死
        screen.ontimer(alt_costume,130)    # 130毫各后继续
alt_costume()

running = True                             # 控制while循环
clock = Clock()                            # 新建时钟对象

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 飞扬小鸟Python精灵模块简版已关闭评论

收拾玩具_继承Sprite类演示

"""
   收拾玩具,本程序演示了如何继承Sprite类。
   程序操作方法:单击每个角色,把它们放入圆圈即可。
   
"""
from sprites import *

class Toy(Sprite):
    def __init__(self,shape=2,pos=(0,0),visible=True,
                 undobuffersize=1000,tag='sprite'):
        Sprite.__init__(self,shape=shape,pos=pos,visible=visible,
                        undobuffersize=undobuffersize,tag=tag)
        self.clicks = 0             # 描述单击次数
        self.status = ''            # 描述状态 
        
screen = Screen()                   # 新建屏幕

d = Sprite(visible=False)           # 新建画圆的精灵 
d.color('dodger blue')
d.pensize(4)
d.fd(200)
d.left(90)
d.pendown()
d.circle(200)                       # 画圆


toys = []                           # 新建列表
for i in range(10):
    t = Toy(i)                      # 新建玩具
    t.gotorandom()                  # 到随机坐标
    while t.distance(0,0) < 200:t.gotorandom()
    t.say('请单击我,而不是拖动我',1000,False)
    toys.append(t)                  # 加入列表 

leftkey = Mouse(1)

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 收拾玩具_继承Sprite类演示已关闭评论

魔幻世界王子召集令

"""
   魔幻世界王子召集令 .
   魔幻世界的王子非常想念他的小老虎们。
   他召集起来,要清点一下它们的数量。
   请按空格键让小老虎们报数吧。
   
"""
from sprites import *

screen = Screen()
screen.bgcolor('dodger blue')
screen.title('魔幻世界王子召集令')

prince = Sprite(shape='王子.png',pos=(250,-100))
prince.saycolor('white')
prince.say("按空格键让我的老虎们报数")

rows = 3
cols = 5
tigers = []
for r in range(rows):
    for c in range(cols):
        x = -280 + c * 100
        y = 150 - r * 200
        s = Sprite(shape='tiger.png',pos=(x,y))
        s.saycolor('yellow')
        tigers.append(s)

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 魔幻世界王子召集令已关闭评论

受重力的汉字_自由落体弹跳

"""
   受重力的汉字,本程序把字符串转换成角色,然后让它们做自由落体运动。
   到了最底下后会反弹,角色们还是可以拖动的。
   
"""
from sprites import *       # 从精灵模块导入所有命令

string = '风火轮编程'

images = []
for zi in string:
    filename = f'res/{zi}.png'
    images.append(filename)
    txt2image(zi,filename,fontsize=36)

screen = Screen()
screen.bgcolor('pink')       # 背景颜色为粉红色

zigroup = Group('zi')        # 新建组,标签为zi
y = 200
for i in range(len(string)):
    x = -100 + i * 50
    # 下面角色的标签为zi,它们会自动加入到zigroup
    s = Sprite(shape=images[i],tag='zi',pos=(x,y))
    s.dy = 0   
    
clock = Clock()              # 新建时钟对象

以下代码省略......
        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 受重力的汉字_自由落体弹跳已关闭评论

鸡兔同笼问题射击效果演示

"""
   鸡兔同笼问题射击效果演示,
   本程序并不是尝试解决鸡兔同笼问题,而是以一种效果抛出这个问题。
   它是一个动画。本程序需要sprites模块支持,请打开cmd窗口,输入
   pip install sprites进行安装。
"""
from sprites import *

string = '有若干鸡兔在同一个笼子里,从上面数有35个头,从下面数有94只脚。问笼中各有多少只鸡和兔?'
chars = []
for char in string:
    pic = f'res/{char}.png'           # 图像文件名
    txt2image(char,pic,fontsize=32)   # 文字转图像
    s = Sprite(pic,pos=(0,-200),visible=False)
    s.color('red')
    chars.append(s)                   # 添加到列表

screen = Screen()
screen.bgcolor('yellow')
screen.tracer(0,0)

dummy = Sprite(visible=False)
dummy.sety(200)
dummy.write('鸡兔同笼',align='center',font=('楷体',38,'bold'))
screen.update()
cols = 10                             # 列数
dx = 40                               # 列间距 
dy = 40                               # 行间距
startx = -200                         # 起始x坐标
starty = 100                          # 起始y坐标

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 鸡兔同笼问题射击效果演示已关闭评论

韩信点兵问题字幕演示

"""
   韩信点兵问题演示
"""
from sprites import *

title = '韩信点兵简介'
question = "秦朝末年,楚汉相争。一次,韩信将1500名将士与楚王大将李锋交战。苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是韩信整顿兵马 也返回大本营。当行至一山坡,忽有后军来报,说有楚军骑兵追来。只见远方尘土飞扬,杀声震天。汉军本来 己十分疲惫,这时队伍大哗。 韩信兵马到坡顶,见来 敌不足五百骑,便急速点兵迎敌。他命令士兵 3 人一排,结果多出2名;接着命令士兵 5 人一排,结果多出3名;他又命令士兵 7人一排,结果又多出2名。 韩信马上向将士们宣布: 我军有1073名勇士,敌人不足五百,我们居高临下,以众击寡,一定能打败敌人。汉军本来就信服白己的统帅,这一来更相信 韩信是“神仙下凡”、ι神机妙算”。于是士气大振。一时间施旗摇动,鼓声喧天,汉军步步进逼,楚军乱作一团。交战不久,楚军大败而逃。通过编程的方法,计算出韩信部队剩余人数。"

def write_one_by_one(tom,dx,string):
    """
       tom:精灵对象
       dx:水平间距
       string:字符串
    """
    ft = ('楷体',16,'normal')    
    代码省略......


screen = Screen()
screen.bgcolor('dodger blue')

s = Sprite(visible=False)
s.addy(250)
s.color('yellow')
s.write("韩信点兵问题演示",align='center',font=('黑体',22,'bold'))
s.write(5)
s.color('white')
s.goto(-250,150)

write_one_by_one(s,20,question)

screen.mainloop()
        
    


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 韩信点兵问题字幕演示已关闭评论

猴子吃桃问题演示

python猴子吃桃问题演示

python猴子吃桃问题演示

 """
   猴子吃桃问题演示,本程序并不是解决猴子吃桃问题,
   而是制作一个提出这个问题的动画。
"""
from sprites import *

ft = ('楷体',22,'normal')
words = ['一只猴子看见一堆桃子',
         '第一天它吃了这堆桃子的一半加1个',
         '第二天又吃了剩下的一半加1个',
         '依此类推',
         '到第十天只剩下1个桃子了',
         '请问最初有多少桃子?']
screen = Screen()
screen.bgcolor('dodger blue')
s = Sprite(visible=False)
s.color("white")
s.write("猴子吃桃问题演示",align='center',font=ft)
clock = Clock()                     # 新建时钟对象
s.wait(5)                           # 等 待 5 秒钟

以下代码省略......


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 猴子吃桃问题演示已关闭评论

老鼠自动找花程序

mouse auto seek flower

"""
   老鼠找花,本例中老鼠会自动找到花朵,然后把它背到圆圈里。
"""
from sprites import *

flower = Sprite('res/flower.png',pos=(-100,100))
flower.scale(0.6)
flower.follow = False            # 自定义逻辑属性,表示是否跟随
flower.end = False               # 自定义逻辑属性,表示是否放下

mouse = Sprite('res/rat1.png')   # 新建老鼠
mouse.setheading(random.randint(1,360))

radius = 100
x0,y0 = 250,100
bug = Sprite(pos=(x0,y0))        # 画圆圈的虫子
bug.pendown()
bug.fd(radius)
bug.left(90)
bug.circle(radius)
bug.right(90)
bug.bk(radius)

clock = Clock()

以下代码省略......


下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 老鼠自动找花程序已关闭评论

数字陷阱动态演示

"""
   数字陷阱动态演示,
   70年代中期,美国各所名牌大学校园内,人们都像发疯一般,废寝忘食地玩弄一种数学游戏。这个游戏十分简单:任意写出一个自然数N,并且按照以下的规律进行变换:
   如果是个奇数,则下一步变成3N+1。如果是个偶数,则下-步变成N/2。
   以下是Python动态演示版,属于简易算法.
   无论N 是怎样一个数字,都无法逃出落入底部的4-2-1循环,最终都无法逃脱回到谷底1,永远也逃不出这样的宿命。
   自然界中的小水滴在高空中受上升气流的推动,在云层中忽上忽下,越积越大并形成冰,最后突然落下来,变成了冰雹,这就是冰雹的形成过程。 而这个数字陷阱之所以叫冰雹猜想,是因为算来算去,数字上上下下,最后一下子像冰雹似的掉下来,变成了一个数字“1”。
   这就是著名的“冰雹猜想”,也叫“数字陷阱”。通过编程的方法,验算“冰雹猜想”是否成立。
   
"""
from sprites import *

screen = Screen()       # 新建屏幕

s = Sprite()            # 新建角色
s.pencolor('dodger blue') 
while True:
    numbers = []
    n = random.randint(10,20)
    numbers.append(n)
    while n != 1:
        if n%2==0:
            n = n/2
        else:
            n = 3 * n + 1
        numbers.append(n)

以下代码省略......
        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 数字陷阱动态演示已关闭评论

内接正多边形演示动画

"""
   内接正多边形演示动画
"""
from sprites import *

def draw_poly(obj,points):
    obj.goto(points[0])
    obj.pendown()
    for point in points[1:]:
        obj.goto(point)
    obj.goto(points[0])
    obj.penup()       

radius = 200            # 半径
x0,y0 = 0,0             # 圆心
vertexs = [ ]           # 顶点列表

for n in range(3,11):   # 从三角形到10边形
    vs = []
    angle = 90
    for _ in range(n):        
        x = radius * math.cos(math.radians(angle))
        y = radius * math.sin(math.radians(angle))
        vs.append((x,y))
        angle = angle + 360/n
    vertexs.append(vs)
print(vertexs)
screen = Screen()       # 新建屏幕

s = Sprite()
s.pensize(5)
s.color('red')
s.setheading(90)


以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 内接正多边形演示动画已关闭评论

打靶游戏

"""
   打靶游戏,本程序还会自动截屏,这样就能制作一个gif文件了.
"""
from sprites import *

width,height = 480,360           # 定义宽高
screen = Screen()                # 新建屏幕
screen.setup(width,height)       # 设置宽高
screen.bgpic('stage.png')        # 设定背景

准心 = Sprite(shape='准心.png')  # 新建准心
弹孔 = Sprite(shape='弹孔.png')  # 新建弹孔

leftkey = Mouse(1)               # 鼠标左键
rightkey = Mouse(3)              # 鼠标右键
score = 0
counter = 0                      # 计数器
while True:                      # 无限循环
    screen.save(f'res/game{counter}.png') # 截屏幕
    counter += 1                          # 计数器增1
    准心.goto(mouse_pos())       # 准心跟随鼠标指针
    if rightkey.down():          # 如单击右键重来
        score = 0
        弹孔.clear()

以下代码省略......
            

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 打靶游戏已关闭评论

猴小子冲关_横版过关游戏

"""
   猴小子冲关.py
"""
from sprites import *
try:
    import pygame
except:
    import sys
    print("本程序需要pygame混音器支持以便播放音效。\n请先用pip install pygame命令在cmd窗口下安装。")
    input()
    sys.exit()

title = '猴小子冲关_Python精灵模块版本'
pygame.mixer.init()
pygame.mixer.music.load('audio/Jetpack Joyride.wav')
pygame.mixer.music.play(-1,0)
dead_sound = pygame.mixer.Sound("audio/死.wav")
collect_sound = pygame.mixer.Sound("audio/collect.wav")

bgi = 0
bgs = [f'bgs/{index}.png' for index in range(12)]  # 12张背景图
width,height = 480,360
screen = Screen()
screen.setup(width,height)
screen.bgpic(bgs[bgi])
screen.title(title)

weapons = ['im/剑.png','im/匕首.png','im/戟.png','im/环.png','im/锤.png',
           'im/盾4.png','im/箭.png','im/菜刀.png','im/血滴子.png','im/cat.png']

_help = Sprite('im/title.png',visible=False)
_help.sety(120)
_help.stamp(3)                     # 3秒后此图章被清除
_help.shape('im/help.png')
_help.sety(60)
_help.stamp(5)                     # 5秒后此图章被清除


# 障碍物
obstacle = Sprite(shape=random.choice(weapons),visible=False)  # 障碍物
x = random.randint(width,width*2)
y = random.randint(-height//2,height//2)
obstacle.goto(x,y)
# obstacle不断地旋转
def auto_rotate():
    obstacle.left(30)
    screen.ontimer(auto_rotate,80)
auto_rotate()

# 金币
coins = [f"im/g{index}.png" for index in range(8)]
c_index = 0
c_amounts = len(coins)
coin = Sprite(shape=coins[0],visible=False)
coin.scale(0.5)
x = random.randint(width,width*2)
y = random.randint(-height//2,height//2)
coin.goto(x,y)
coin.show()
# coin不断地换造型
def coin_rotate():
    global c_index
    c_index += 1
    c_index %= c_amounts
    coin.shape(coins[c_index])
    screen.ontimer(coin_rotate,100)
coin_rotate()

# 猴小子
costumes = ['im/造型1.gif','im/造型2.gif']
index = 0
monkey = Sprite(shape=costumes[index],pos=(-200,0))
monkey.scale(0.5)
monkey.alive = True
monkey.right(90)
monkey.saycolor('cyan')
monkey.saybordercolor('yellow')
monkey.say("冲啊!!",wait=False)
# monkey不断地变换造型
def alt_costume():
    global index
    index = 1 - index
    monkey.shape(costumes[index])
    screen.ontimer(alt_costume,50)
alt_costume()

akey = Key('a')                     # 实例化a按键 
dkey = Key('d')                     # 实例化d按键
wkey = Key('w')                     # 实例化w按键 
skey = Key('s')                     # 实例化s按键
screen.listen()                     # 监听按键 
clock = Clock()
speed = 10                          # 背景移动速度 
distance = 0                        # 路程
counter = 0                         # 接到的金币计数器
while speed>0:    
  if monkey.alive == True:
     if akey.down(): monkey.addx(-4)   # 按左键往左移
     if dkey.down(): monkey.addx(4)    # 按右键往右移
     if wkey.down(): monkey.addy(4)    # 按上键往上移
     if skey.down(): monkey.addy(-4)   # 按下键往下移 
  else:
     monkey.move(0,-5)              # 猴死下坠
     if monkey.ycor()<-height//2-500:speed = 0
     

以下代码省略......

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, sprites, turtle | 猴小子冲关_横版过关游戏已关闭评论