A08_数据转换_Python教学视频

这是风火轮编程Python初级教程的第八课,下面是用python制作的学习大纲。

李兴球Python数据转换幻灯片教程

李兴球Python数据转换幻灯片教程


用Python制作的幻灯片类型的作品,本课主要学习数据转换的几个命令,以下是完整源代码。
本程序需要sprites模块支持,安装方法为在命令提示符下输入以下命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade

"""
   第八课 数据转换
"""
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,700)
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()

ft = ('楷体',38,'bold')
t = Sprite(visible=False,pos=(-500,100))
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()          # 鼠标左键
while not m1.down():screen.update()

# 简介
brief ="""
数据之间是可以进行转换的,如整数可以转换小数,

列表和元组可以互相转换,字符串也能转换成列表。

本课主要学习一些命令,然后做练习以巩固所学。
"""
if brief!='':  # 如果有课程简介,则生成一个角色,
    ftx = ('宋体',18,'normal')
    简介 = Sprite(visible=False,pos=(0,-100))
    简介.color('white')
    简介.write(brief,align='center',font=ftx)    
    while  m1.down():screen.update()    
    while not m1.down():screen.update()    

for x in range(66):              # 标题向右消失
    t.clear()
    t.write(s,align='center',font=ft)    
    t.fd(10)
    if brief!='':        
        简介.clear()
        简介.write(brief,align='center',font=ftx)
        简介.bk(10)
    clock.tick(60)
简介.clear()     

#以下是显示学习的内容段
studycontent = """
主要学习内容

1、int命令

2、float命令

3、bool命令

4、str命令

5、list命令

6、tuple命令

7、综合运用与作业
"""
t.color('white')
t.clear()
t.sety(-260)              # 这里修改菜单的显示y坐标
ft = ('楷体',24,'bold')
s = studycontent
while not m1.down():screen.update()
#  下面的代码显示主菜单
for x in range(120):
    t.clear()
    t.write(s,align='center',font=ft)    
    t.bk(5)
    clock.tick(60)

def slow_write(t,string):
    """
       t:角色,string:要显示的字
       本函数慢慢的显示字。
    """
    string = string.split('\n') # 换成列表     
    oldxy = t.position()   # 记录老的坐标
    t.goto(-340,310)       # 到新的坐标
    for line in string:    # 每一行字
        for char in line:     # 每一个字符
            t.write(char,align='center',font=ft)
            t.wait(0.2)
            cd = len(bytes(char,'gb2312'))
            if cd == 1:
                t.addx(20)
            else:
                t.addx(30)
        t.setx(-336)
        t.addy(-50)
    t.goto(oldxy)
     
s1 = """
1、int命令

把小数或者全是数字的字符串转换成整数。
如int('32')返回结果就是32。int(3.14)返回3。
"""
def press1():
    t.clear()
    slow_write(t,s1)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press1,'1')


s2 = """
2、float命令

把全是数字的字符串(包括.号)和整数转换成浮点数。
如float('10.9')得到10.9,float(56)得到56.0
"""
def press2():
    t.clear()
    slow_write(t,s2)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press2,'2')


s3 = """
3、bool命令

把其它数据转换成逻辑数据。
如bool(10)返回True,bool(-10)也是返回True。
总之,非0的数据返回的都是真,0本来就是假。
bool('')返回False,bool('编程')返回True。
非空字符串返回真,空字符串返回假。
bool([])返回False,bool(['px','a'])返回True。
空列表返回假,非空列表返回真,元组也一样。  
"""
def press3():
    t.clear()
    slow_write(t,s3)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press3,'3')


s4 = """
4、str命令

把其它数据转换成字符串,相当于把任何其它数据
加上引号。如str(123)结果是'123',
str([102,476])返回'[102,476]'。
"""
def press4():
    t.clear()
    slow_write(t,s4)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press4,'4')


s5 = """
5、list命令

新建空列表,或者把字符串或元组转换成列表。
如list('abc')返回['a','b','c']
list((32,76))返回[32,76]。
以后会学range命令,它会产生一些数据。
如range(10)会产生从0到9的数据,用list命令
的话,那么list(range(10))就会产生下面的列表:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
"""
def press5():
    t.clear()
    slow_write(t,s5)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press5,'5')

s6 = """
6、tuple命令

新建空元组,或者把列表或字符串转换成元组。
如tuple('abc')得到('a','b','c'),
tuple([102,476,8])得到(102,476,8),
tuple(str(65))得到('6','5')
"""
def press6():
    t.clear()
    slow_write(t,s6)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press6,'6')

s7 = """
7、综合运用与作业
   
int(str(32)),   
str(type(32)),
float(id(256))
type(len('ab')),
len(str(type(()))) ,
len(str(type('爱编程'))),
list(str(id(len('abc')))),
len(str(['风火轮编程','Python']),   
len('Python') * 3 + len('Python'*3)
"""
def press7():
    t.clear()
    slow_write(t,s7)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press7,'7')

 

byebye = """
下次再见!
"""
def pressq():
    t.clear()
    t.color('cyan')
    t.home()
    t.write(byebye,align='center',font=('宋体',38,'bold'))
    while not m1.down():screen.update()
    screen.bye()    
screen.onkeypress(pressq,'q')


screen.mainloop()

以下是付费内容,包括播放视频、python源代码及素材等等。

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

发表在 python, sprites, turtle, 视频教程 | 标签为 , , , , | A08_数据转换_Python教学视频已关闭评论

A07_元组与错误提示_Python教学视频

这是风火轮编程Python初级教程的第七课,下面是用python制作的学习大纲。

李兴球Python元组启蒙错误提示学习大纲

李兴球Python元组启蒙错误提示学习大纲

用Python制作的幻灯片类型的作品,用来教Python元组启蒙的,还要学习几个常见的错误类型,以下是完整源代码。
本程序需要sprites模块支持,安装方法为在命令提示符下输入以下命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade

"""
   第七课 元组与错误提示
"""
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,700)

# 下面的代码让窗口可以拖动.
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()

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

m1 = Mouse()          # 鼠标左键
while not m1.down():screen.update()

for x in range(50):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.fd(10)
    clock.tick(60)
    
#以下是显示学习的内容段
studycontent = """
主要学习内容

1、元组的概念

2、元组的索引

3、语法错误

4、名字错误

5、类型错误

6、索引错误

7、练习与作业
"""
t.color('white')
t.clear()
t.sety(-260)              # 这里修改菜单的显示y坐标
ft = ('楷体',24,'bold')
s = studycontent
while not m1.down():screen.update()
#  下面的代码显示主菜单
for x in range(110):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.bk(5)
    clock.tick(60)

def slow_write(t,string):
    """
       t:角色,string:要显示的字
       本函数慢慢的显示字。
    """
    string = string.split('\n') # 换成列表     
    oldxy = t.position()   # 记录老的坐标
    t.goto(-340,310)       # 到新的坐标
    for line in string:    # 每一行字
        for char in line:     # 每一个字符
            t.write(char,align='center',font=ft)
            t.wait(0.2)
            cd = len(bytes(char,'gb2312'))
            if cd == 1:
                t.addx(20)
            else:
                t.addx(30)
        t.setx(-336)
        t.addy(-50)
    t.goto(oldxy)
     
s1 = """
1、元组的概念

元组是以小括号封闭的,以逗号隔开的,有顺序的,
不可变的数据集合。英文名为tuple。
它是一种固定的组合,一旦元组中的数据确定了,
那么我们就不能往里面添加,删除与修改数据。
定义一个空元组可以直接输入(),也可以用tuple命令,
如xy=tuple()会返回一个名为xy的空元组。
新建一个只有一个数据的元组,要在这个数据后面加逗号。
如,(3,)是一个只有一个数据的元组。
type查看元组的结果为<class 'tuple'>
"""
def press1():
    t.clear()
    slow_write(t,s1)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press1,'1')


s2 = """
2、元组的索引

元组和列表一样,要访问元组中的每个数据
也是通过索引号进行的。
假设有一个元组叫cors=(32,76),那么我们可
以通过cors[0]访问它的第一个数据,
通过cors[-1]访问它的最后一个数据,
但是不能给它们赋值。
如果试图修改cors[0]的值,那么就会显示类型错误。
即cors[0]=77这样的式子是会出错的。
"""
def press2():
    t.clear()
    slow_write(t,s2)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press2,'2')


s3 = """
3、语法错误

当我们输入代码的时候,不小心可能会出现了语法方面
的错误。Python就会显示语法错误。
如输入print(32),那么就会出错语法错误。它的英文
提示字符串为:
SyntaxError: invalid character in identifier
这个错误是由于前半部分小括号输入错误,应该输入
半角小括号。
"""
def press3():
    t.clear()
    slow_write(t,s3)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press3,'3')


s4 = """
4、名字错误

当我们使用了一个没有定义的‘变量’时,就会出现
这个错误。假设并没有叫x的变量,当用print打印它
时就会显示以下的字符。
NameError: name 'x' is not defined
意思是名字错误:名字'x'没有被定义。
"""
def press4():
    t.clear()
    slow_write(t,s4)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press4,'4')


s5 = """
5、类型错误

当某种数据不支持某种操作时,就会出现类型错误。
典型的如,元组不支持修改数据。
那么试图修改它里面的数据的时候就会现出类型错误。
假设有一个元组叫colors,它的值如下所示:
('red','bule','cyan'),
那么输入colors[1]='black'就会显示类型错误。
英文为:
TypeError: 'tuple' object does not
support item assignment
上面的意思是类型错误:‘元组’对象不支持项目赋值。   
"""
def press5():
    t.clear()
    slow_write(t,s5)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press5,'5')

s6 = """
6、索引错误

当使用超出范围的索引号时,就会出现这个错误。
假设有颜色表为:
colors=['red','bule','cyan'],由于colors列表
最大的索引号为2,那么打印colors[5]的时候就会
出现索引错误。它的英文提示为:
IndexError: list index out of range
意思就是索引错误:列表索引超出范围。
"""
def press6():
    t.clear()
    slow_write(t,s6)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press6,'6')

s7 = """
7、练习与作业

① 说出列表和元组的区别。
② ('abcd')这个数据是什么类型?
③ 把总结的四种类型提示里的英文单词放在一个元组中。
④ tuple命令不仅能新建空元组,也能在它的小括号里
加上字符串或列表。尝试下面的用法:
tuple('风火轮编程')和
tuple([32,76,8])。
说说tuple这个时候起了什么作用?
"""
def press7():
    t.clear()
    slow_write(t,s7)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press7,'7')

 

byebye = """
下次再见!
"""
def pressq():
    t.clear()
    t.color('cyan')
    t.home()
    t.write(byebye,align='center',font=('宋体',38,'bold'))
    while not m1.down():screen.update()
    screen.bye()    
screen.onkeypress(pressq,'q')

screen.mainloop()

以下是付费内容,包括播放视频、思维导图、python源代码及素材等等。

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

发表在 python, sprites, turtle, 视频教程 | 标签为 , , , , , , , , | A07_元组与错误提示_Python教学视频已关闭评论

A06_列表入门_Python教学视频

这是风火轮编程Python初级教程的第六课,下面是用python制作的学习大纲。

李兴球Python列表入门学习大纲

李兴球Python列表入门学习大纲

用Python制作的幻灯片类型的作品,用来教Python列表入门的,以下是完整源代码。
本程序需要sprites模块支持,安装方法为在命令提示符下输入以下命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade

"""
   第六课 列表入门
"""
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,700)

# 下面的代码让窗口可以拖动.
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)


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

m1 = Mouse()          # 鼠标左键
while not m1.down():screen.update()

for x in range(50):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.fd(10)
    clock.tick(60)
    
#以下是显示学习的内容段
studycontent = """
主要学习内容

1、列表的概念与定义列表

2、列表的索引

3、列表数据的可变性

4、append和len命令

5、颜色列表

6、练习与作业
"""
t.color('white')
t.clear()
t.sety(-260)              # 这里修改菜单的显示y坐标
ft = ('楷体',24,'bold')
s = studycontent
while not m1.down():screen.update()
#  下面的代码显示主菜单
for x in range(110):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.bk(5)
    clock.tick(60)

screen.listen()

def slow_write(t,string):
    """
       t:角色,string:要显示的字
       本函数慢慢的显示字。
    """
    string = string.split('\n') # 换成列表     
    oldxy = t.position()   # 记录老的坐标
    t.goto(-340,310)       # 到新的坐标
    for line in string:    # 每一行字
        for char in line:     # 每一个字符
            t.write(char,align='center',font=ft)
            t.wait(0.2)
            cd = len(bytes(char,'gb2312'))
            if cd == 1:
                t.addx(20)
            else:
                t.addx(30)
        t.setx(-336)
        t.addy(-50)
    t.goto(oldxy)
     
s1 = """
1、列表的概念与定义列表
列表是以中括号封闭的,以逗号隔开的,有顺序的,
可变数据集合,英文名为list。
定义一个空列表可以直接输入[],也可以用list命令,
如list()会生成一个空列表。
例如,x = [32,76,1024],就定义了一个列表,
它存储了三个整型数据。
列表中的数据的类型也可以是浮点数、布尔数据、
字符串数据甚至另一个列表。用type查看列表的
结果为<class 'list'>。
"""
def press1():
    t.clear()
    slow_write(t,s1)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press1,'1')


s2 = """
2、列表的索引

和字符串一样,列表中的数据也有索引,
要访问列表中的每个数据的方法和字符串一样。
从左到右数,索引号是从0到最后一个数据的索引号。
从右到左数则是从-1到第一个数据的索引号。
和字符串一样,如果通过超出范围的索引号来
访问列表中的数据,也会发生索引错误。
"""
def press2():
    t.clear()
    slow_write(t,s2)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press2,'2')


s3 = """
3、列表数据的可变性

我们可以向列表中添加数据,删除数据,也可以直接
修改列表中的某个数据,列表是可变的!
如,x=[32,76,1024],那么让x[0]=255是可以的,
甚至可以让x[0]='风火轮编程'也是没有问题的。
"""
def press3():
    t.clear()
    slow_write(t,s3)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press3,'3')


s4 = """
4、append和len命令

如果要向列表末尾添加数据,那么可以用append命令。
用法:列表名称.append(数据)。假设有名为cs的列表。
它的值为['red','orange'],那么cs.append('yellow')
会向这个列表的末尾添加'yellow'这个字符串。
列表还有其它的一些命令,在此不做讲解。
如果要统计列表中数据的数量,可以用len命令。
假设有名为x的列表,len(x)则会返回x列表中的
数据的数量。
"""
def press4():
    t.clear()
    slow_write(t,s4)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press4,'4')


s5 = """
5、颜色列表

我们可以定义一个列表,在这个列表中都是颜色单词。
可以把它取名为colors。以下是定义颜色表的代码:
colors=['red','orange','yellow',
'green','cyan','blue','purple']
"""
def press5():
    t.clear()
    slow_write(t,s5)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press5,'5')

s6 = """
6、练习与作业

① 定义一个叫animals的列表,里面有些动物的名称。
然后用append命令添加一些数据进去。最后打印出
这个列表中的数据的数量。
② 用list命令不仅可以新建一个空列表,也能在小
括号里写上一个字符串,看看这样做会返回什么结果。
"""
def press6():
    t.clear()
    slow_write(t,s6)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press6,'6')
 

byebye = """
下次再见!
"""
def pressq():
    t.clear()
    t.color('cyan')
    t.home()
    t.write(byebye,align='center',font=('宋体',38,'bold'))
    while not m1.down():screen.update()
    screen.bye()    
screen.onkeypress(pressq,'q')

screen.mainloop()

以下是付费内容,包括播放视频、思维导图、python源代码及素材等等。

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

发表在 python, sprites, turtle, 视频教程 | 标签为 , , , , | A06_列表入门_Python教学视频已关闭评论

什么是编程趣味编程打字效果演示

"""
   什么是编程?这就是编程!
"""
__author__ = '李兴球'
__blog__ = 'www.lixingqiu.com'
__date__ = '2020/5/10'

import sys
import time
import os.path  
import win32clipboard as w    
import win32con  
import win32api
import pyautogui

def getText():
    """读取剪贴板"""  
    w.OpenClipboard()  
    d = w.GetClipboardData(win32con.CF_TEXT)  
    w.CloseClipboard()  
    return d

def setText(aString):
    """写入剪贴板"""  
    w.OpenClipboard()  
    w.EmptyClipboard()  
    w.SetClipboardText(aString)  
    w.CloseClipboard()
    
if __name__=='__main__':  

    self = "E:\\Python\\sprites\\001_最简弹球\\最简弹球.py"
    f = open(self,encoding='utf-8')
    filecontent = f.read()
    f.close()
    
    win32api.ShellExecute(0, 'open', 'notepad.exe', 'C:\\Users\\Administrator\\Desktop\\最简弹球.py','',1)
    time.sleep(2)
    for char in filecontent:
        
        setText(char)
        if char=='\n':
            pyautogui.hotkey('enter')           
        else:
            pyautogui.hotkey('ctrl', 'v')        
            
        time.sleep(0.02)

    # 程序编写完毕,你明白什么是编程了吗?
    

发表在 python | 标签为 , , , , , | 什么是编程趣味编程打字效果演示已关闭评论

A05_字符串入门_Python教学视频

这是风火轮编程Python初级教程的第五课,下面是用python制作的学习大纲。

李兴球Python字符串入门学习提纲

李兴球Python字符串入门学习提纲

用Python制作的幻灯片类型的作品,用来教Python字符串入门的,以下是完整源代码。
本程序需要sprites模块支持,安装方法为在命令提示符下输入以下命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade

"""
   第五课 字符串入门
"""
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,700)

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

m1 = Mouse()          # 鼠标左键
while not m1.down():screen.update()

for x in range(50):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.fd(10)
    clock.tick(60)
    
#以下是显示学习的内容段
studycontent = """
主要学习内容

1、字符串的概念

2、转义字符

3、len命令

4、str的加法和乘法

5、字符串的索引

6、索引错误

7、字符串的不可变性
"""
t.color('white')
t.clear()
t.sety(-300)              # 这里修改菜单的显示y坐标
ft = ('楷体',24,'bold')
s = studycontent
while not m1.down():screen.update()
#  下面的代码显示主菜单
for x in range(110):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.bk(5)
    clock.tick(60)

screen.listen()

def slow_write(t,string):
    """
       t:角色,string:要显示的字
       本函数慢慢的显示字。
    """
    string = string.split('\n') # 换成列表     
    oldxy = t.position()   # 记录老的坐标
    t.goto(-340,310)       # 到新的坐标
    for line in string:    # 每一行字
        for char in line:     # 每一个字符
            t.write(char,align='center',font=ft)
            t.wait(0.2)
            cd = len(bytes(char,'gb2312'))
            if cd == 1:
                t.addx(20)
            else:
                t.addx(30)
        t.setx(-336)
        t.addy(-50)
    t.goto(oldxy)
     
s1 = """
1、字符串的概念
在Python中,字符串是用引号封闭的一些字符。
用成对的双引号,单引号,或三引号封闭一些字
符时都可以定义字符串。当然,我们可以把它
赋值给一个变量。
如 s='red',或者 c="yellow"都是定义字符串。
用三引号封闭的话,在定义时可以直接敲回车。
当输入type('a')时,会显示<class 'str'>。
str是英文string的前三个字母,它就是字符串的意思
(单击返回主菜单)
"""
def press1():
    t.clear()
    slow_write(t,s1)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press1,'1')


s2 = """
2、转义字符
在计算机里,有些字符是看不见的,
如换行符写做\'\\n\'。
当我们按键盘上的Tab键的时候,
在文本框里会表现为跳一格。
这就是在输入制表符,它写做\'\\t\'。
当我们敲回车键时,就是输入回车符号,它写做\'\\r\'。
那么,当我们要输入反斜杠本身时,要怎么输入呢?
我们可以输入\'\\\\\'。来表示一个反斜杠。
当我们用三引号定义字符串,并且在输入字符的时候
敲了回车时,Python会自动帮我们加上换行符
而不是回车符。(单击返回主菜单)
"""
def press2():
    t.clear()
    slow_write(t,s2)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press2,'2')


s3 = """
3、len命令
len是求字符串中字符个数的命令。
语法:len(字符串)。
如len('风火轮编程')的结果是5。
len(\'\\n\')的结果是1,这是由于\'\\n\'表示是一个换行符。
len('')  的结果是0,这是由于''是空字符串。
(单击返回主菜单)
"""
def press3():
    t.clear()
    slow_write(t,s3)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press3,'3')


s4 = """
4、str的加法和乘法
连接字符串用加号即可。如'ab' + 'cd'
字符串可以乘以一个整数,它会把字符串
重复一定的次数。如len('风火轮编程'*3)
的结果是15。(单击返回主菜单)
"""
def press4():
    t.clear()
    slow_write(t,s4)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press4,'4')


s5 = """
5、字符串的索引
字符串中的每个字符有编号,从左到右数,
编号从0开始的,这个编号叫做索引号。
我们可以通过索引号访问字符串中的字符。
方法:字符串名称[index],其中index表示索引号。
假设有字符串s='abcdefg',那么s[0]就是'a',
s[3]就是'd'。
在字符串中,索引号也可以从右到左数。
这个时候索引号是从-1开始。也就是说s[-1]
表示倒数第一个字符,s[-2]表示倒数第二个字符,
依此类推。(单击返回主菜单)
"""
def press5():
    t.clear()
    slow_write(t,s5)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press5,'5')

s6 = """
6、索引错误
字符串中的字符是有一定数量的,也就是说
索引号肯定有一定范围。假设有 s='abcdefg',
那么它的索引号是从0到6。
如果输入s[7]会怎么样呢,这个时候就会提示错误。
这个错误叫indexError,即索引错误。
我们实践一下索引错误。(单击返回主菜单)
"""
def press6():
    t.clear()
    slow_write(t,s6)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press6,'6')

s7 = """
7、字符串的不可变性
字符串有一个特性就是它是不可变的。
主要表现为,我们可以通过索引号访问它的某个
字符,但不能修改它。假设有s='abcdefg',
那么让s[0]='风'是不可以的,这是会出错的。
(单击返回主菜单)
"""
def press7():
    t.clear()
    slow_write(t,s7)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press7,'7')

 

byebye = """
下次再见!
"""
def pressq():
    t.clear()
    t.color('cyan')
    t.home()
    t.write(byebye,align='center',font=('宋体',38,'bold'))
    while not m1.down():screen.update()
    screen.bye()    
screen.onkeypress(pressq,'q')

# 下面的代码让窗口可以拖动.
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.mainloop()

以下是付费内容,包括播放视频、思维导图、python源代码及素材等等。

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

发表在 python, sprites, turtle, 视频教程 | 标签为 , , , , | A05_字符串入门_Python教学视频已关闭评论

A04_数字变量与赋值演示程序_Python教学视频

这是风火轮编程Python初级教程的第四课,下面是用python制作的学习大纲。

李兴球Python数字变量与赋值演示文档

李兴球Python数字变量与赋值演示文档

用Python制作的幻灯片类型的作品,用来教Python数字变量与赋值及累加的,以下是完整源代码。本程序需要sprites模块支持,安装方法为在命令提示符下输入以下命令安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites –upgrade

"""
   第四课,数字变量与赋值
"""
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,700)

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

m1 = Mouse()          # 鼠标左键
while not m1.down():screen.update()

for x in range(50):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.fd(10)
    clock.tick(60)
    
#以下是显示学习的内容段
studycontent = """
主要学习内容

1、变量的概念

2、赋值与累加 

3、整型数据

4、浮点型数据

5、逻辑型数据

6、type命令

7、id命令

8、del命令

"""
t.color('white')
t.clear()
t.sety(-340)
ft = ('楷体',24,'bold')
s = studycontent
while not m1.down():screen.update()
#  下面的代码显示主菜单
for x in range(110):
    t.clear()
    t.write(s,align='center',font=ft)
    t.wait()
    t.bk(5)
    clock.tick(60)

screen.listen()

def slow_write(t,string):
    """
       t:角色,string:要显示的字
       本函数慢慢的显示字。
    """
    string = string.split('\n') # 换成列表     
    oldxy = t.position()   # 记录老的坐标
    t.goto(-340,310)       # 到新的坐标
    for line in string:    # 每一行字
        for char in line:     # 每一个字符
            t.write(char,align='center',font=ft)
            t.wait(0.2)
            cd = len(bytes(char,'gb2312'))
            if cd == 1:
                t.addx(20)
            else:
                t.addx(30)
        t.setx(-336)
        t.addy(-50)
    t.goto(oldxy)
     
s1 = """
1、变量的概念:
变量是存储在内存中的一个对象,
这个对象有名字,有地址,有具体的值。
Python通过变量的名字就能找到这个值。
下面的代码可以定义一个变量,这个变量
的值是一个整数。
x=10,变量可以有多个名字,如y=x,就是
给x变量又取了一个名字。这两个变量名都
指向同一个数值。
(单击返回主菜单)
"""
def press1():
    t.clear()
    slow_write(t,s1)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press1,'1')


s2 = """
2、赋值与累加:
在Python中的等于号叫赋值号。
所谓赋值就是把赋值号右边的
计算结果赋值给左边的变量。
如,y=100,就是把100赋值给y。
而,z=y+200,会先把y+200的结果算出来,
再赋值给z。
那么,y=y+100,就会把y+100的值计算出来,
再赋值给y,所以注意这里和数学中有区别。
也就是说赋值号并不是判断两边的值相等的意思。
像 y=y+100这样的式子叫累加,也可以写做
y+=100
(单击返回主菜单)
"""
def press2():
    t.clear()
    slow_write(t,s2)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press2,'2')


s3 = """
3、整型数据:
刚才我们已经使用了整数。在Python中它们叫做
整型数据。如32,65536。我们可以把一个整型
数据赋值给一个变量,如x=32,那么通过x就能
访问到32这个数据。x就是一个整型变量,
或者说是整数变量。整数的英文名叫integer,
简写为int。
(单击返回主菜单)
"""
def press3():
    t.clear()
    slow_write(t,s3)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press3,'3')


s4 = """
4、浮点型数据:
在Python中用浮点型数据表示小数。如3.14
,10.0或者0.01都是浮点型数据。我们可以定义
一个变量的值为一个小数,如pai=3.14,
那么pai就是一个小数变量。浮点型写做float。
它在英文中的本意是飘浮的意思。为什么取名
为“飘浮”数据呢?这是由于在计算机中不能
精确地表示小数,像是飘浮不定的样子,所以
就取了这么个名字。
(单击返回主菜单)
"""
def press4():
    t.clear()
    slow_write(t,s4)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press4,'4')


s5 = """
5、逻辑型数据:
在Python中要表示真或者假,成立或者不成立,
用的是逻辑数据。逻辑数据只有两个值,一个
是True,代表真、是、成立的意思。另一个是
False,代表假,不是,否,不成立的意思。
当然,我们也可以把逻辑数据赋值给一个变量,
如 x=True,y=False。
逻辑数据之间可以进行加、减、乘、除等运算。
把True乘以3的结果是3,False乘以3的结果是0。
大家可以在IDLE中测试一下,会得出一个结论,
那就是True实际上就是1,而False实际上就是0。
逻辑数据也叫布尔数据,英文为boolean,简写
为bool。int、float和bool型变量统称为数字变量。
英文名为numeric。(单击返回主菜单)
"""
def press5():
    t.clear()
    slow_write(t,s5)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press5,'5')

s6 = """
6、type命令:
在Python中用type命令显示数据或者变量的类型。
如type(256),会返回<class 'int'>,class是类
型的意思,int是整数的意思。
也可以把一个整数赋值给一个变量,如x=32,
在IDLE中输入type(x)也会返回<class 'int'>。
如果输入type(3.14),则返回<class 'float'>。
表示3.14这个数是一个浮点型数据。
如果输入type(True),返回<class 'bool'>。
表示True是一个布尔型,也就是逻辑型数据。
(单击返回主菜单)
"""
def press6():
    t.clear()
    slow_write(t,s6)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press6,'6')

s7 = """
7、id命令:
在Python中,一个变量就是一个对象。一个
具体的对象是有名称,有地址,有具体的值。
那么这个地址可以通过id命令得到。假设有名字为
x变量,它的值为128,那么id(x)就能得到这个
变量的地址。在Python中也称为这个变量的编号
。它是一串数字。这就像每个变量都有一个门牌
号码一样。通过门牌号码,Python就能访问到变
量的值。
(单击返回主菜单)
"""
def press7():
    t.clear()
    slow_write(t,s7)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press7,'7')


s8 = """
8、del命令。
如果要删除一个变量怎么办呢?
在Python中没有直接提供删除变量的机制。
但是提供了删除变量名字的命令。
这个命令叫del。有时候,我们可以通过删除
变量的名字间接的删除变量,但是如果变量
有多个名字,那么这个变量还是没有被删除。
本质上,我们是不能删除一个变量的。
如果一个变量失去了所有的名字,Python会
自动删除这个变量。
(单击返回主菜单)
"""
def press8():
    t.clear()
    slow_write(t,s8)
    while not m1.down():screen.update()
    t.clear()
    t.write(s,align='center',font=ft)    
screen.onkeypress(press8,'8')

byebye = """
下次再见!
"""
def pressq():
    t.clear()
    t.color('cyan')
    t.home()
    t.write(byebye,align='center',font=('宋体',38,'bold'))
    while not m1.down():screen.update()
    screen.bye()    
screen.onkeypress(pressq,'q')

screen.mainloop()

以下是付费内容,包括播放视频、思维导图、python源代码及素材等等。

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

发表在 python, sprites, turtle, 视频教程 | 标签为 , , , , , , , , | A04_数字变量与赋值演示程序_Python教学视频已关闭评论

画个五角星让它绕中心点旋转

李兴球Python画个五角星绕中心点旋转

李兴球Python画个五角星绕中心点旋转


画一个五角星让它旋转起来,这在Python中有几个方案可选,这里提供一个不是用自定义形状的方案,以下是部分源代码,
其实关键的代码函数,也就是starpoints这个函数,它是核心。代码已经给你了。接下来就看你的聪明才智了。
如果还是没有想出怎么编写完整程序,那么可以扫码付款,下载完整Python源代码。

"""
   画个五角星让它绕中心点旋转
   本程序用海龟画一个填充为青色的五角星。
   然后它会旋转起来。
"""
import math
import time
import turtle

cors = []                            # x,y坐标表

def starpoints(angle,radius):
    """形成五角星的五个坐标点"""
    cors.clear()                     # 清空列表
    for _ in range(5):               # 重复5次
        a = math.radians(angle)      # 转为弧度值
        x = radius * math.cos(a)     # 算x坐标
        y = radius * math.sin(a)     # 算y坐标
        angle += 72
        cors.append((x,y))           # 添加到列表
        
screen = turtle.getscreen()          # 获取屏幕 
screen.tracer(0,0)                   # 关闭自动刷新
screen.bgcolor('black')              # 背景颜色为黑 

turtle.ht()                          # 隐藏海龟
turtle.color('red','cyan')            # 颜色为红
turtle.pensize(4)                    # 画笔粗细为4
turtle.penup()                       # 抬笔

pass                                 # 这里的代码省略了哦
    

需要完整源代码,

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

发表在 python, turtle | 标签为 , , , , , | 画个五角星让它绕中心点旋转已关闭评论

人类之路

李兴球Python人类之路环保

本作品气场足, 就够了,还要什么? 以下是python人类之路的完整源代码:

"""
   人类之路.py
   配合着扣人心弦的背景音乐,让人觉得这是一个发人生省的Python的作品。
   人类诞生以来直到今天虽然物质生活大大改善,但人类的目标是什么?
   地球没有人类是否会“过得”更好?地球是纯粹的偶然还是必然?
   生命对于宇宙的意义到底是什么?或许没有人类,“意义”这个词根本就没有意义。
   
"""
import os
from sprites import *
from PIL import Image,ImageSequence

def split_gif(gif_file):
    """拆帧函数,本函数会把gif拆帧后的文件保存为png图存放在文件夹里"""
    bgs = []
    fld = os.path.basename(gif_file).split('.')[0]    
    if not os.path.exists(fld):os.mkdir(fld)
    im = Image.open(gif_file)
    size = im.size
    index = 0
    for frame in ImageSequence.Iterator(im):
        filename = fld + os.sep + str(index) + '.png'        
        frame.save(filename)
        bgs.append(filename)
        index = index + 1
    im.close()
    return bgs,size

end_switch = False
bgs,size = split_gif('source.gif')

screen = Screen()                          # 新建屏幕对象
screen.bgcolor('black')                    # 背景颜色涂黑
screen.title('人类之路_基于Python海龟画图而创作_作者:李兴球')                   # 给窗口写上标题
screen.setup(size[0],size[1])              # 设置窗口大小

PlaySound('star.wav',SND_LOOP|SND_ASYNC)   # 循环异步播放背景音乐

# 下面的代码让背景不断地轮换显示
index = 0
def switch_background():
    global index,end_switch
    screen.bgpic(bgs[index])
    if end_switch==False:
       screen.ontimer(switch_background,100)
    index = index + 1
    index = index % len(bgs)
switch_background()

# 人类进化图
evolution = Sprite('human evolution.png')
evolution.setalpha(128)

# 下面的代码是打字幕
words = '人类从刀耕火种进化到高科技社会。让人类的生活更加美好。可是也让地球温度升高,人类生存环境遭受破坏。如果任由发展,后果不堪设想!'
e = Sprite(visible=False )              # 用来写字的对象
e.color('cyan')                         # 设定颜色为青色
e.goto(-220,200)                        # 定位到坐标(-220,200)
counter = 0                             # 计数器清零
for char in words:
    e.write(char,align='center',font=('黑体',24,'normal'))
    e.fd(37)
    counter = counter + 1
    if counter % 13 == 0 :
        e.setx(-220)
        e.addy(-40)
    e.wait(0.4)
e.wait(1)


# 下面的代码让人类进化图往下移
for _ in range(280):
    evolution.addy(-1)
    evolution.wait(0.1)

# 下面的代码以虚像效果显示未来城市图像
future = Sprite('未来城市.png',visible=False,pos=(100000,0))
future.setalpha(0)
future.home()
future.show()
for a in range(0,256):
    future.setalpha(a)
evolution.hide()            # 进化图片隐藏
end_switch = True           # 不再切换背景


# 下面的代码显示最后的话语
backtitle = Sprite('后话.png',pos=(0,300))
for _ in range(240):
    backtitle.addy(-1)
    backtitle.wait(0.1)

screen.mainloop()

需要完整音乐和图片素材和pyhton源文件,请

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

发表在 python, sprites, turtle | 标签为 , , , , , , | 人类之路已关闭评论

可视化的自动抠图器

李兴球Python可视化自动抠图器演示选择
以下是所有完整源代码:

"""
   可视化的自动抠图器.py
   这是有可视化界面的自动抠图器,方便初级使用者
   使用方法,打开图像后,用鼠标指针选择要抠的区域,然后按抠图按钮。
   要保存为jpg图像!
"""
__author__ = '李兴球'
__date__ = '2020/5/6 21:36'
__blog__ = 'www.lixingqiu.com'

import os
import cv2
import numpy as np
from tkinter import *
from PIL import Image,ImageTk
from tkinter import filedialog

def cv_imread(file_path):
    """解决opencv的imread不能读取中文路径的问题"""
    cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)
    return cv_img

def cv_imwrite(file_path):
    """解决opencv的imread不能读取中文路径的问题"""
    cv_img = cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)
    return cv_img

def mousedown_event(event):
    """按下处理"""
    global startx,starty
    startx = event.x - 2 
    starty = event.y - 2 

def mousemove_event(event):        
    global endx,endy,rect_item
    endx = event.x - 2 
    endy = event.y - 2
    rect = (startx,starty,endx,endy)
    canvas.coords(rect_item,*rect)
    window.title(rect)
    
def displa_pic():
    """在画布中显示这张图像"""
    global picfilename ,img,image_cv2
    #print(picfilename)
    image_cv2 = cv_imread(picfilename)
    #print(image_cv2)
    b,g,r = cv2.split(image_cv2)
    img = cv2.merge((r,g,b))
    im = Image.fromarray(img)
    img = ImageTk.PhotoImage(image=im) 
    
    w,h = img.width(),img.height()
    canvas.configure(width=w,height=h)
    canvas.itemconfig(canvas.img,image=img)

def dig_pic():
    """抠图"""
    global image_cv2

    rect = canvas.coords(rect_item)                 # 左上角坐标和宽高
    rect = (int(rect[0]),int(rect[1])
            ,int(rect[2]-rect[0]),int(rect[3]-rect[1]))
     
    mask = np.zeros(image_cv2.shape[:2], np.uint8)
    bgModel = np.zeros((1,65), np.float64)   
    fgModel = np.zeros((1,65), np.float64)

    cv2.grabCut(image_cv2, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)
    mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype(np.uint8)
     
    out = image_cv2 * mask2[:, :, np.newaxis]

    #cv2.imshow('风火轮编程自动抠图', out)
    #cv2.waitKey()
    # 把out写入到磁盘中,out是一个numpy的2d阵列.
    file_save = filedialog.asksaveasfilename()    
    #不能保存在中文路径cv2.imwrite(f,out,[int(cv2.IMWRITE_PNG_COMPRESSION),9]) 
    cv2.imencode('.jpg', out)[1].tofile(file_save)

def open_pic():
    """打开图像函数
       options为以下名称:
       -defaultextension, -filetypes, -initialdir,
       -initialfile, -multiple, -parent, -title, or -typevariable
    """
    global picfilename                        # 全局变量,要处理的图像文件名
    options = {'initialdir':os.getcwd(),
               'filetypes':[('png图像', '.png'),
                            ('jpg图像', '.jpg'),
                            ('jpeg图像', '.jpeg'),
                            ('gif图像', '.gif'),
                            ('bmp图像', '.bmp'),                            
                            ('all files', '*.*')]}
    picfilename = filedialog.askopenfilename(**options)
    if picfilename !=None or picfilename!="": displa_pic()

startx,starty,endx,endy = 0,0,0,0
rect_item = 0
picfilename = ''
image_cv2 = None

window = Tk()
window.title('可视化的自动抠图器_作者:李兴球 www.lixingqiu.com')
canvas = Canvas(window,width=1,height=1,bg="#e3e3e3")
canvas.pack(side=LEFT)

open_btn = Button(window,text='打开图像',command=open_pic)
open_btn.pack(side=RIGHT)

dig_btn = Button(window,text='抠图',command=dig_pic)
dig_btn.pack(side=RIGHT)

img = PhotoImage(width=1, height=1)
img.blank()
canvas.img = canvas.create_image(0,0,anchor=NW,image=img)
rect_item = canvas.create_rectangle(startx,starty,endx,endy,width=4,outline='red')

canvas.bind("",mousedown_event)
canvas.bind("",mousemove_event)

window.mainloop()

发表在 pillow, python, tkinter | 标签为 , , , , , , | 可视化的自动抠图器已关闭评论

生成圆内汉字图片.py(汉字转图像)

李兴球Python汉字转图片
以下是完整的源代码:

"""
   生成圆内汉字图片.py
   这个程序会生成图片,图片是正方形的,内有一个圆,圆内中央有一个汉字。
"""
import os
from PIL import Image, ImageDraw,ImageFont

def makecirclezi(char,length,font,bg,fg):
    """char:一个汉字
       length:图片边长(正方形的)
       font:ttf字体文件
       bg:圆的颜色
       fg:字的颜色
    """
    if len(char)>1:char = char[0]
    fnt = ImageFont.truetype(font,length//2) # 加载ttf字体 ,会自动搜索windows/fonts路径下的ttf文件
    im =Image.new("RGBA",(length,length))
    draw =ImageDraw.Draw(im)
    #draw.ellipse((0,0, length, length), fill=bg)
    wa,ha = draw.textsize(char,font=fnt)
    draw.text(((length-wa)//2,(length-ha)//2),char,font=fnt,fill=fg)
    return im

path = 'F:\\风火轮编程\\www.scratch8.net\\z0'
s = '中华人民共和国是一个伟大的国家我们都非常热爱自己的国家晓看云霞霜满天'
for char in s:
    pic = makecirclezi(char,100,"FZCQJW_0.TTF",(50,128,163),(250,252,253))
    pic.save(path + os.sep + char + '.png')

发表在 pillow, python | 标签为 , , , | 生成圆内汉字图片.py(汉字转图像)已关闭评论

Python自动抠图程序.py

李兴球Python自动抠图后monkey.png

李兴球Python自动抠图后monkey.png


上面的是抠图前的猴子图形,下面的是抠后的猴子图形,
李兴球Python自动抠图monkey
以下是完整的源代码:

"""
   Python自动抠图测试程序.py
   这个作品对monkey.jpg进行抠图,
   事先需要确定好所抠区域的左上角坐标和宽高
"""
import cv2
import numpy as np
 
fname = 'monkey.jpg'
img = cv2.imread(fname)
rect = (50,30,372,285)                   # 左上角坐标和宽高
 
mask = np.zeros(img.shape[:2], np.uint8)
bgModel = np.zeros((1,65), np.float64)
fgModel = np.zeros((1,65), np.float64)
cv2.grabCut(img, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype(np.uint8)
 
out = img * mask2[:, :, np.newaxis]
print(out)
#cv2.imshow('风火轮编程自动抠图', out)
#cv2.waitKey()
# 把out写入到磁盘中,out是一个numpy的2d阵列.
cv2.imwrite('monkey.png',out,[int(cv2.IMWRITE_PNG_COMPRESSION),9]) 

发表在 python | 标签为 , , , , , | Python自动抠图程序.py已关闭评论

急速返航

李兴球Python rocket

这是一个躲避类型游戏,让火箭安全返回地球! 下面是部分代码

"""
   急速返航.py
   这是一个躲避小游戏。
   太空火箭执行完任务后要返回地球。
   可是地球周围布满了太空垃圾,唉,都是人类自己造的孽啊。
   请按左右方向箭头,操作火箭避开垃圾,成功返航。
   本程序用到了爆炸函数,注意它有一个times参数,这是爆炸次数!
   本程序需要Python精灵模块v1.36版本支持。如果没有安装,请在cmd输入以下命令安装。   
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites  --upgrade
"""
from sprites import *                      # 从精灵模块导入所有命令
from pygame import mixer                   # 从pygame模块导入混音器

mixer.init()                               # 混音器初始化
deathsnd = mixer.Sound('res/DEATH.wav')    # 实例化死亡声效
mixer.music.load('res/未开始音乐.mp3')     # 加载音乐 
mixer.music.play(-1,0)                     # 循环播放音乐

lines = ['res/line1.png','res/line2.png','res/line3.png']

screen = Screen()                          # 生成屏幕对象
screen.setup(480,360)                      # 设置屏幕宽高
screen.title('急速返航_躲避游戏_李兴球博客')
screen.bgpic('res/星空.png')               # 设置屏幕背景图 

earth = Sprite('earth',pos=(0,380))         # 地球角色 
# endpic是最后要显示的图片
endpic = Sprite(['res/成功.png','res/失败.png'],
                visible=False,pos=(0,1000))

line = Sprite(lines,visible=False)          # 新建线条角色
dynamic_bgs = []
for _ in range(20):   
   b = line.clone()                         # 克隆一条背景线
   b.shapeindex(random.randint(0,2))        # 随机选择一个造型
   x = random.randint(-240,240)             # 生成x坐标
   y = random.randint(360,3600)             # 生成y坐标
   b.goto(x,y)                              # 到达这个x,y坐标
   dynamic_bgs.append(b)                    # 添加到列表中
   b.show()                                 # 显示
   
pics1 = ['rocket0.png','rocket1.png','rocket2.png']
rocket = Sprite(pics1,pos=(0,-130))

# 序幕阶段,火箭是不动的,背景自上而下移动
clock = Clock()                             # 新建时钟对象
for _ in range(600):                        # 重复200次
   rocket.nextshape()                       # 火箭下一个造型 
   for bg in dynamic_bgs:                   # 迭代背景表中的线条
       bg.addy(-50)                         # 线条往下移50个单位
       if bg.ycor() < -180:                 # 如果线条y坐标小于-180
          x = random.randint(-240,240)      # 生成一个x坐标
          y = random.randint(360,3600)      # 生成一个y坐标
          bg.goto(x,y)                      # 线条到这个坐标   
   screen.update()                          # 更新屏幕显示
   clock.tick(60)                           # 固定fps为60帧

[bg.remove() for bg in dynamic_bgs]         # 删除所有
mixer.music.stop()                          # 停止播放音乐
mixer.music.load('res/循环音乐.mp3')        # 加载音乐
mixer.music.play(-1,0)                      # 循环播放音乐

# 进入第二阶段,太空垃圾来了,需要按左右方向箭头操作它躲避
garbs = []
garbage = Sprite('garbage',visible=False,pos=(0,300))
for _ in range(30):
   g = garbage.clone()
   g.shapeindex(random.randint(0,2))
   x = random.randint(-240,240)
   y = random.randint(360,3600)   
   g.goto(x,y)
   garbs.append(g)
   g.show() 
counter = 0

leftkey = Key("Left")
rightkey = Key("Right")
screen.listen()
isdead = False                      # 描述是否碰到太空垃圾的变量
for _ in range(2000):
   rocket.nextshape()
   if leftkey.down():rocket.addx(-4)
   if rightkey.down():rocket.addx(4)
   if rocket.overlap_with(garbs):
       rocket.hide()
       isdead = True
       break
   for g in garbs:
       g.addy(-6)
       if g.ycor() < -180:
          g.goto(random.randint(-240,240),
                 random.randint(360,3600))
   screen.update()
   clock.tick(60)

# 第三阶段,根据火箭是否爆炸决定显示什么
mixer.music.stop()

pass                  # 这里的代码省略了....

screen.mainloop()

需要全部源代码和素材,请

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

发表在 python, sprites, turtle | 标签为 , , , , | 急速返航已关闭评论

Python的gif图像切割器gifcroper

一个真正能用的gif图像切割器gifcroper。

"""
   gif图像切割器,
   gifcroper.py
   这个程序把gif图片拆帧,把每帧都切割一下,最后合成gif图片。
   记住作者是李兴球哦。
"""
from PIL import Image,ImageSequence
  
def gifcroper(input_gif,box,output_gif,interval=100):
    """把gif动图切分一块,原理就是拆帧,对每幅图进行crop,然后合帧
       input_gif:源gif文件,box:四元组,左上角和右下角坐标
       output_gif:输出的gif文件,interval:帧间隔毫秒时间
    """
    frames = []
    im = Image.open(input_gif)
    for frame in ImageSequence.Iterator(im):   # 迭代每一帧
         frames.append(frame.crop(box))        # 把这帧砍一下!
    im.close()
    newgif = frames[0]                         # 第一帧
    # 下面把其它的帧都添加进去,从而合成gif动图。
    newgif.save(output_gif, save_all=True,quality=70,
                append_images=frames[1:], duration=interval)  

if __name__ == '__main__':
    
    igif = 'python掉人.gif'
    ogif = '_python掉人.gif'
    box = (90,0,390,279)
    gifcroper(igif,box,ogif,200)

发表在 pillow, python | 标签为 , , , , , | Python的gif图像切割器gifcroper已关闭评论

Python给gif图片加文字水印

"""
   给动态的gif图片加文字水印。
   本人用这个图片一下了给成千上万的gif图都加上了自己的文字水印。
   
"""
import os
from random import choice
from PIL import Image,ImageFont,ImageDraw,ImageSequence

_colors = ['red','orange','yellow','green','cyan','blue','white']

def watermark_on_gif(in_gif,out_gif,text='scratch8'):
    """本函数给gif动图加水印"""
    frames = []
    myfont = ImageFont.truetype("msyh.ttf", 12)
    im = Image.open(in_gif)
    water_im = Image.new("RGBA", im.size)
    draw = ImageDraw.Draw(water_im)     
    width,height = water_im.width,water_im.height
    fontsize = draw.textsize(text,font = myfont) # 文字的宽度和高度
    #draw.text(( width//2-fontsize[0]//2, height-fontsize[1]*4), text, font=myfont,fill='gray')
    draw.text(( 10, 10), text, font=myfont,fill=choice(_colors))
           
    water_mask = water_im.convert("L").point(lambda x: min(x, 160))
    water_im.putalpha(water_mask) 

    #print(im.info)
    index = 0
    for frame in ImageSequence.Iterator(im):             # 迭代每一帧
        frame = frame.convert("RGBA")
        #frame = Image.alpha_composite(frame,water_im)
        frame.paste(water_im,None,water_mask)
        frames.append(frame)
    newgif = frames[0]
    newgif.save(out_gif, save_all=True,append_images=frames[1:], quality=85,duration=100)
    im.close()

if __name__ == "__main__":

    counter = 0
    path = os.getcwd() + os.sep + '下载的gif_水印'
    for file in os.listdir(path):
        infile = path + os.sep + file
        outfile = path + os.sep + '__' + file
        try:
            watermark_on_gif(infile,outfile)
            counter += 1
            print(infile,'成功加水印')
        except:
            pass
    print('共加水印',counter)

发表在 pillow, python | 标签为 , , , , | Python给gif图片加文字水印已关闭评论

svg2png.py,svg文件转png文件源代码

"""
   svg2png.py,svg文件转png文件
   这个程序把svg矢量文件转换成位图的png文件,需要有cairosvg模块支持.
   在cmd输入以下命令可以完成安装这个模块:
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cairosvg --upgrade

"""
import os
import cairosvg
from xml.dom.minidom import parse

def get_svgfile_size(svgfile):
    """获取svgfile大小,有些svg的大小为0,无法转换成png"""    
    DOMTree = parse(svgfile)
    collection = DOMTree.documentElement
    if collection.hasAttribute("width"):
        return collection.getAttribute("width"),collection.getAttribute("height")

    
def convert_svg2png(path):
    """把path路径下的svg文件转换成png文件,如果这个svg里包括位图信息,则出错
       包括位图的svg文件有
							
发表在 pillow, python | 标签为 , , , , | svg2png.py,svg文件转png文件源代码已关闭评论

盘山公路的牵引

李兴球Python盘山公路的牵引过关游戏

这是一个python游戏,牵引小车到达终点,这个程序主要用到了像素级的颜色碰撞,以下是部分代码预览:

"""
   盘山公路的牵引.py
   牵引小小卡丁车到达终点的一个小游戏。
   这个程序用到了Python颜色碰撞命令collidecolor,
   它会检测卡丁车和背景的颜色之间的碰撞,一旦碰到了不是公路的颜色,
   卡丁车就会退回到起始点。
"""
from sprites import *
from pygame import mixer

mixer.init()
failsnd = mixer.Sound('fail.wav')
succsnd = mixer.Sound('成功.wav')
mixer.music.load('bgm.mp3')
mixer.music.play(-1,0)
                      
screen = Screen()
screen.setup(960,720)
screen.title('盘山公路的牵引')

background = Sprite('road.png')
background.ondrag(None)

c1 = (163,241,94)
c2 = (255,215,103)
c3 = (99,99,99)
initpos = (-400,300)
cart = Sprite('卡车.png',pos=(-400,300))
running = True

while running:
      pass                       # 此处代码省略哦.............
mixer.music.stop()
succsnd.play()
screen.title('成功牵引卡丁车到达终点')
screen.mainloop()

需要全部源代码和素材,请

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

发表在 python, sprites, turtle | 标签为 , , , , | 盘山公路的牵引已关闭评论

放梯子

李兴球Python精灵模块放梯子动画演示
Python精灵模块导入了PIL的Image,所以下面的代码可以直接用Image.new新建一个图形对象。

"""
   放梯子.py
   本程序单击鼠标左键会放置一个蓝色长方体在屏幕上
"""
from sprites import *                   # 从精灵模块导入所有命令   

screen = Screen()                       # 新建屏幕

pic = Image.new("RGBA",(150,50),(0,255,0))
pic.save('green.png')
blue = Sprite('green.png')  

leftkey = Mouse()
delay = 0
clock = Clock()                         # 新建时钟对象
while True:
    blue.goto(mouse_pos())              # 跟随鼠标移动
    if leftkey.down() and delay==0:     # 只有delay为0时才放梯子
        blue.clone()                    # 克隆长方体
        screen.title(len(screen._turtles))
        delay = 30                      # 设为30,这样就不能克隆了
    if delay>0 : delay -= 1             # 让delay减1
    screen.update()                     # 更新屏幕显示 
    clock.tick(60)                      # 时间没到1/60秒则继续等待
    

发表在 python, sprites, turtle | 标签为 , , | 放梯子已关闭评论

python大炮打蝙蝠射击游戏_python精灵模块版

李兴球python大炮打蝙蝠射击游戏
这是一个用Python制作的射击游戏,用鼠标操作大炮去打天上飞来的蝙蝠阵列。这个游戏有配有背景音乐有音效,气势宏大….

"""
   大炮打蝙蝠.py
   蝙蝠大队来袭。它们要干什么?难道要去散布新型冠状病毒?
   一定要阻止它们!通过这个案例,你将会学习到如何通过鼠标操作角色左右移动,
   以及如何对列表的每一个成员进行碰撞检测。
"""
from sprites import *
from pygame import mixer                  # 从pygame导入混音器

mixer.init()
shootsnd = mixer.Sound('榴弹炮.wav')      # 实例化发射音效

mixer.music.load('Melee- Menu.wav')       # 加载背景音乐
mixer.music.play(-1,0)                    # 从头开始循环播放音乐

screen = Screen()                         # 新建屏幕
screen.setup(480,360)
screen.bgpic('背景1.BMP')
screen.title('大炮打蝙蝠_Python精灵模块_李兴球博客')

canon = Sprite('大炮.png',pos=(0,-150))   # 新建大炮
canon.left(90)
canon.ondrag(None)                        # 不可拖动

bomb = Sprite('bomb.png',visible=False)   # 新建炮弹
bomb.left(90)

bats = {}                                 # 蝙蝠字典,项目编号对应角色的字典
batimgs = ['bat1-a.png','bat1-b.png']
mbat = Sprite(batimgs,pos=(-260,150),visible=False)

leftkey = Mouse()                         # 鼠标左键
shooting = False
clock = Clock()                           # 时钟对象
counter = 0
while True:
    counter = counter + 1
    pass                                  # 大侠,代码省了,请自行完成,我相信你!
       
    screen.update()
    clock.tick(60)

如果需要下载源代码和所有素材,请

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

发表在 python, sprites, turtle | 标签为 , , , , , | python大炮打蝙蝠射击游戏_python精灵模块版已关闭评论

python减速之彩色风车

李兴球Python减速之彩色风车
在Python精灵模块中如何检测有没有按住鼠标呢?下面的程序

"""
   减速之彩色风车.py
   这是一个单击鼠标的小程序。
   操作方法是单击鼠标左键按住一会儿。那么变量spin的值就会一直增加。
   松开后,风车就会以spin做为“速度”不断地旋转。
   由于spin的值越来越小,所以风车旋转的速度越来越慢。
   
"""
from sprites import *

screen = Screen()
screen.title('减速之彩色风车')
screen.bgpic('movies outside.png')

bug = Sprite(visible=False,pos=(0,200))
bug.write2('请按住鼠标左键一会儿,然后松开')
spin = 0
windmill = Sprite('windmill.png')   # 新建风车角色

mleft = Mouse()                     # 鼠标左键
clock = Clock()                     # 时钟对象
while True:
   pass                             # 这里省略一些代码
   screen.update()
   clock.tick(60)        

需要所有源代码和素材,请

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

发表在 python, sprites, turtle | 标签为 , , , , | python减速之彩色风车已关闭评论

python宁静的小山村配音画

李兴球python模糊变清晰效果crystal

这个动画实现的是图片由模糊渐渐变清晰的效果。下面python代码预览:

"""
  宁静的小山村
"""
from pygame import mixer            # 从pygame模块导入混音器
from sprites import Sprite,Screen   # 从精灵模块导入角色类和屏幕命令

mixer.init()                        # 初始化混音器 
mixer.music.load('alto0.mp3')       # 加载背影音乐
mixer.music.play(-1,0)              # 循环播放背景音乐

screen = Screen()                   # 新建屏幕
screen.title('宁静的小山村')        # 写上标题

# 新建角色
img_blur = Sprite('blur.png',visible=False,pos=(11111,0))
img_blur.set_alpha(0)
img_blur.home()
img_blur.show()
img_blur.ondrag(None) 

pass                       # 此处代码省略

screen.mainloop()

需要完整源代码和图片与音乐素材,请

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

发表在 python, sprites, turtle | 标签为 , , , | python宁静的小山村配音画已关闭评论

python模拟3D打印大楼

李兴球Python模拟3D打印大楼

"""
   模拟3D打印大楼.py
"""
from sprites import Sprite,Key

def build(level):
    """搭建level层"""
    global scale
    for x in range(level):
        sps.append(sp1.clone())
        sp1.addy(1)
        scale -= 0.001
        sp1.scale(scale)

scale = 1                       # 代表角色的缩放值
sp1 = Sprite('造型1.png')       # 新建角色 
screen = sp1.getscreen()        # 获取屏幕对象
sps = [sp1]                     # sps列表存储所有角色
build(3)                        # 建3层
sp1.shape('造型2.png')          # 切换到造型2.png
build(15)                       # 建15层
for x in range(8):              # 在范围8迭代x
    sp1.shape('造型3.png')      # 切换到造型3.png 
    build(10)                   # 建10层
    sp1.shape('造型4.png')      # 切换到造型4.png
    build(5)                    # 建5层
sp1.shape('造型5.png')          # 切换到造型5.png
build(3)                        # 建3层

leftkey = Key("Left")           # 实例化左方向箭头 
rightkey = Key("Right")         # 实例化右方向箭头
screen.listen()                 # 监听屏幕按键检测
while True:                     # 当成立的时候
    pass                        # 大侠你好,代码省略,请自行完成? 

如果需要完整源代码和素材,请

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

发表在 python, sprites, turtle | 标签为 , , , , , | python模拟3D打印大楼已关闭评论

Python单击角色换位

李兴球Python单击角色换位
这个程序采用onclick绑定处理函数,让角色接受单击事件。

"""
   单击角色换位,
   本程序展示了单击让角色交换位置的最基本代码,
   
"""
from sprites import Sprite,Screen

def process(b,x,y):
    """处理单击"""
    global clicks,oldpos,oldb
    b.onclick(None)
    clicks += 1                     # clicks是2的时候才交换
    if clicks%2 == 0 :              
        clicks = 0
        if oldb != b :              # 不是同一个角色才换位
           p = b.pos()              # 把坐标记录 
           b.slide(oldb.position()) # 到刚才点的角色的坐标
           oldb.slide(p)            # 刚才点的角色到b角色之前的坐标 
    else:       
        oldb = b        # clicks是1,只是记录一下这个角色
    print(clicks,b)
    b.onclick(lambda x,y: process(b,x,y))

screen = Screen()

b1 = Sprite()
b1.onclick(lambda x,y: process(b1,x,y))
b2 = Sprite(1,pos=(100,0))
b2.onclick(lambda x,y: process(b2,x,y))
b3 = Sprite(2,pos=(100,100))
b3.onclick(lambda x,y: process(b3,x,y))
b4 = Sprite(3,pos=(-100,100))
b4.onclick(lambda x,y: process(b4,x,y))

clicks = 0                      # 统计单数次数
screen.mainloop()

发表在 python, sprites, turtle | 标签为 , , , | Python单击角色换位已关闭评论

Python自动寻路_Python颜色碰撞示例

李兴球Python自动寻路动画演示
人工智障程序哟!这个程序简单的采用Python精灵模块中的颜色碰撞命令,让小猫可以自动走到终点碰到绿旗。
以下是部分代码预览:

"""
  自动寻路.py
  本程序使用角色的coloroverlap命令检测自己身上的颜色和其它角色上面的颜色是否重叠。
  需要Python精灵模块V1.35版本以上支持。如果你的电脑没有安装Python精灵模块,
  请在命令提示符下输入以下命令进行安装:
  pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites --upgrade
"""
from sprites import Sprite,Screen

screen = Screen()                     # 新建屏幕
screen.setup(960,720)                 # 设定宽高 
screen.colormode(255)                 # 颜色模式
screen.title("自动寻路_Python精灵模块_颜色碰撞示例_李兴球博客_www.lixingqiu.com")

red = (255,0,0)                       # 红色
blue = (0,63,255)                     # 蓝色
brown = (102,102,0)                   # 棕色                    
green = (0,255,0)                     # 绿色

maze = Sprite('path.png')             # 路径角色
maze.ondrag(None)                     # 不可拖动

cat = Sprite('cat.png',pos=(-50,280)) # 猫角色
cat.wait(3)
cat.left(180)                         # 向后转180度
cat.wait(1)
while True:
     pass                             # 代码忽略,请大侠自己完成
screen.mainloop()

需要完整素材和源代码,请

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

发表在 python, sprites, turtle | 标签为 , , , | Python自动寻路_Python颜色碰撞示例已关闭评论

彩色十字架跳高台

E:\Python\sprites\173_彩色十字架跳高台
以下是部分代码预览:

"""
   彩色十字架跳高台(颜色碰撞).py
"""
from sprites import *

ft = ('黑体',24,'normal')
screen = Screen()                 # 新建屏幕
screen.setup(960,720)             # 设定宽高

platform = Sprite('platform.png') # 平台
cross= Sprite('cross.png')        # 十字架
cross.write("本程序演示颜色碰撞",align='center',font=ft)
crossgreen = (0,128,0)            # 十字架的绿色 
crossred = (255,0,0)              # 十字架的红色
crossorange = (255,165,0)         # 十字架的橙色
crossblue = (0,0,255)             # 十字架的蓝色

leftkey = Key("Left")             # 左方向箭头
rightkey = Key("Right")           # 右方向箭头
upkey = Key("Up")                 # 上方向箭头
screen.listen() 
dy = 0                            # 垂直速度

while True:
    # 十字架的蓝色和迷宫的蓝色的碰撞检测
    pass                          # 代码省略

    screen.update()
    



需要全部素材和源代码,请

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

发表在 python, sprites, turtle | 彩色十字架跳高台已关闭评论

coloroverlap颜色重叠命令示例

李兴球Python的coloroverlap颜色碰撞命令

"""
   coloroverlap颜色重叠命令示例.py
   本程序演示角色的某种颜色和其它角色的某种颜色是否重叠,
   注意,本程序只对其它角色的颜色检测有效,对背景色/背景图/图章/角色所画的图的颜色检测无效。
   
"""
from sprites import *

ft = ('宋体',24,'normal')
screen = Screen()
screen.title('颜色重叠演示程序')

w = Sprite(visible=False,pos=(0,200)) # 用来写字的角色
           
blue = Sprite('blue.png')             # 中间的蓝色方块
r1 = Sprite('p1.png',pos=(100,100))   # 右上角的十字架
r2 = Sprite('p2.png')                 # 随鼠标移动的十字架

c1 = (0,255,255)                      # 代表青色
c2 = (0,0,255)                        # 代表蓝色
clock = Clock()                       # 时钟对象

while 1:   
    r2.goto(mouse_pos())              # r2跟随鼠标移动  
    point = r2.coloroverlap(c1,c2)    # r2的青色和某角色的蓝色重叠
    if point:                         # 如果两色重叠,则显示碰撞点
       w.clear()
       screen.title(point)
       w.write('青色碰到了蓝色' + str(point),align='center',font=ft)
    else:
       screen.title('')               # 否则在屏幕标题栏显示空字符串
       w.clear()
    clock.tick(60)


发表在 python, sprites, turtle | coloroverlap颜色重叠命令示例已关闭评论

collidecolor碰到颜色命令示例

李兴球Python的collidecolor颜色碰撞命令

"""
   颜色碰撞示例程序.py
   本程序演示颜collidecolor命令,它可以检测角色有没有碰到其它角色上面的颜色。
   注意,这个命令对背景颜色/图片/图章/角色所画的图形颜色无效。
"""
from sprites import *

screen = Screen()
screen.title('collidecolor颜色碰撞演示程序')

w = Sprite(visible=False)           # 用于写字的角色
w.addy(100)

blue = Sprite('blue.png')           # 中间的蓝色方块
r1 = Sprite('p1.png',pos=(100,100)) # 右上角的十字架
r2 = Sprite('p2.png')               # 随鼠标移动的十字架

c1 = (0,255,255)                    # 代表青色
c2 = (0,0,255)                      # 代表蓝色
clock = Clock()                     # 时钟对象

while 1:   
    r2.goto(mouse_pos())                # r2跟随鼠标移动  
    flag = r2.collidecolor(c2)          # r2是否碰到蓝色
    if flag:                            # 如果碰到,在标题栏显示
       screen.title('碰到蓝色')
       w.write("碰到蓝色",align='center')
    else:
       screen.title('')                 # 否则在屏幕标题栏显示空字符串
       w.clear()
    clock.tick(60)


发表在 python, sprites, turtle | collidecolor碰到颜色命令示例已关闭评论

鼠闯迷宫_大迷宫游戏.py

李兴球Python鼠闯迷宫大迷宫游戏
以下是部分代码预览:

"""
   大迷宫游戏.py
   小老鼠在一个偌大的迷宫中迷失了方向,请按上下左右方向箭头操作它移动。
   找到出口,走出迷宫。
   本程序需要python精灵模块1.35版本以上支持。
   安装最新版本请用cmd打开命令提示符管理员窗口输入以下命令:
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites  --upgrade
   本程序主要演示的像素级碰撞检测命令pixelcollide。它返回碰撞点坐标,
   主碰方(在这里是老鼠)碰撞点的像素值,被碰方(这时是迷宫),重叠区域矩形。就像下面这样:
   ((14.0, 3.0), (45, 45, 45), (104, 104, 104), (-17.0, 9.0, 18.0, -9.0, 630.0))
   最后重叠区域是一个五元组,这个五元组最后一个值是重叠区域的面积。
   问题是,小老鼠最后找到了绿色的出口,可怎么也无法进门!
   当你理解了pixelcollide的返回值后,相信你能对此程序进行修改,从而解决小老鼠的问题。
   
"""
from sprites import *

screen = Screen()
screen.setup(480,360)
screen.title('大迷宫游戏')

maze = Sprite('1.png')          # 新建迷宫
maze.scale(2)                   # 迷宫长宽扩大为原来2倍
maze.ondrag(None)               # 让迷宫不可拖动,(maze.draggable()能让它重新可拖动)

# 新建有两个造型的老鼠角色
rat = Sprite(['res/rat1.png','res/rat2.png']) 
rat.shapesize(0.5,0.6)

leftkey = Key("Left")           # 向左方向箭头
rightkey = Key("Right")         # 向右方向箭头 
upkey = Key("Up")               # 向上方向箭头
downkey = Key("Down")           # 向下方向箭头
screen.listen()                 # 监听屏幕按键
r = None
while True:
    pass                        # 此处代码忽略 
    screen.update()

如果需要全部素材和源代码,请

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

发表在 python, sprites, turtle | 鼠闯迷宫_大迷宫游戏.py已关闭评论

简易夺旗游戏(python像素级碰撞检测之颜色碰撞)

李兴球Python简易夺旗游戏像素级颜色碰撞
以下是部分代码预览:

"""
   简易夺旗游戏(python像素级碰撞检测之颜色碰撞)
   按上下左右方向箭头操作小虫子去碰到小旗子,游戏就胜利了,
   否则如果碰到黑色,游戏就失败了!
   本程序需要python精灵模块V1.35以上版本支持。演示的是在V1.35版本中的像素级碰撞命令。
   它的名字叫pixelcollide。参数为角色和阈值。本命令只支持都为图形的角色。
   请在cmd命令提示符下面输入以下命令安装python精灵模块。
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites  --upgrade
"""
from sprites import *           # 从精灵模块导入所有命令

screen = Screen()               # 新建屏幕
screen.setup(960,720)           # 设置屏幕宽高

bg = Sprite('背景1.png')        # 新建背景角色
bg.ondrag(None)                 # 让角色不可拖动
bug = Sprite(pos=(-430,-280))   # 新建虫子角色

leftkey = Key("Left")           # 向左方向箭头
rightkey = Key("Right")         # 向右方向箭头 
upkey = Key("Up")               # 向上方向箭头
downkey = Key("Down")           # 向下方向箭头
screen.listen()                 # 监听屏幕按键

while True:
    
    pass                        # 此处代码忽略
    screen.update()
print(r)
screen.title('game over')
screen.mainloop()
        

如果需要全部素材和源代码,请

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

发表在 python, sprites, turtle | 简易夺旗游戏(python像素级碰撞检测之颜色碰撞)已关闭评论

pixelcollide像素碰撞程序.py

李兴球Python像素碰撞检测程序

"""
   像素碰撞程序.py
   本程序演示在python精灵模块中新增的pixelcollide命令。
   它演示了一个角色对另一个角色的像素级碰撞检测。
   pixelcollide命令返回的信息比较丰富。
   在下面的程序中,我们把mover叫主碰方,dummy叫被碰方。
   那么像素碰撞所返回的信息包括以下内容,它是一个4元组。
   第一个数据表示第一个碰撞点的坐标,第二个数据是主碰方在碰撞点的像素值。
   第三个数据是被碰方在碰撞点的像素值。
   第四个数据是两个角色矩形重叠的左上角坐标和右下角坐标及重叠区域面积。
   运行程序后,可以单击鼠标左键,让mover旋转。
   本程序需要python精灵模块1.35版本以上支持。
   安装最新版本请用cmd打开命令提示符管理员窗口输入以下命令:
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites  --upgrade
   
"""
from sprites import *

screen = Screen()                       # 新建屏幕

wer = Sprite(visible=False,pos=(0,150))
dummy = Sprite('xiao2.png')            # 中间的角色
mover = Sprite('xiao3.png')            # 用鼠标指针操作的角色

k = Mouse()                            # 鼠标左键
while 1:
    mover.goto(mouse_pos())            # 移到鼠标指针的坐标
    r = mover.pixelcollide(dummy)      # 对mover和dummy进行像素碰撞
    if r:
        a,b,c,d = r
        wer.clear()                     # 清除以前所画
        wer.goto(0,150)
        wer.write('碰撞点坐标:' + str(a),align='center')
        wer.addy(-25)
        wer.write('mover在碰撞点的颜色值:' + str(b),align='center')
        wer.addy(-25)
        wer.write('dummy在碰撞点的颜色值:' + str(c),align='center')
        wer.addy(-25)
        wer.write('mover和dummy矩形碰撞重叠区域:' + str(d),align='center')
        screen.title(r)
    if k.down():                        # 单击鼠标左键,旋转mover
        while k.down():screen.update()  # 没松开就一直更新屏幕
        mover.left(90)                  # 否则左转90度
    screen.update()                     # 更新屏幕显示

发表在 python, sprites, turtle | pixelcollide像素碰撞程序.py已关闭评论

虫子的gif动图制作

李兴球Python精灵模块gif动图制作
本程序在虫子画图形的时候不断地截图到内存中,最后把所有内存中的图形合成一个gif图形。这个程序关键是用到了屏幕的save方法。它会把虫子画图屏幕截为pillow图形对象。以下是所有代码:

"""
   gif动图制作.py
   本程序演示了如何把虫子画图形的过程保存为gif动图。
   注意在本程序中使用了pillow模块的Image类。
   这是由于sprites模块已经给导入了。
   本程序用到了Python精灵模块,可以用下面命令在cmd窗口中快速安装。
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites  --upgrade
"""
import os
from sprites import *

frames = []                              # im帧列表,以便保存所有截的图形

screen = Screen()                        # 新建屏幕 
bug = Sprite()                           # 新建角色 
bug.color('red')                         # 画笔为红
bug.pensize(10)                          # 画笔粗细为10
bug.pendown()
# 下面是画图形,这里只是简单画一个红色的图,你可以修改为画其它图形,
# 每移动或旋转了角色,都可以保存当前的屏幕到frames列表。
for x in range(8):                       # 在范围8迭代x 
    for y in range(4):                   # 在范围4迭代y
        bug.fd(100)                      # bug前进100个单位
        frames.append(screen.save())     # 添加截屏为帧到列表中
        bug.rt(90)                       # 右转90度
        frames.append(screen.save())     # 添加截屏为帧到列表中
    bug.rt(45)                           # 右转45度  
    frames.append(screen.save())         # 添加截屏为帧到列表中
size = frames[0].size                    # 图像尺寸
print(size)

im = frames[0]                           # 第一帧
im.save('out.gif', save_all=True, append_images=frames[1:],
        optimize=False, duration=200, loop=0)

# 如果像下面这样,那么第一帧就是白色的。
#im = Image.new("RGBA",size,color=(255,255,255,0))  # 新建im图像对象  
#im.save('out.gif', save_all=True, append_images=frames)

screen.mainloop()

发表在 python, sprites, turtle | 虫子的gif动图制作已关闭评论

角色坐标的get和set上下左右命令

李兴球Python精灵方块移动

"""
  坐标的get和set上下左右命令.py
本程序演示精灵模块角色的setleft,setright,settop,setbottom和
getleft,getright,gettop,getbottom命令。
setleft命令用来设置角色最左边的x坐标,getleft命令则是得到角色最左边的x坐标。
setright命令用来设置角色最右边的x坐标,getright命令则是得到角色最右边的x坐标。
settop命令用来设置角色最上边的y坐标,gettop命令则是得到角色最上边的y坐标。
setbottom命令用来设置角色最下边的y坐标,getbottom命令则是得到角色最下边的y坐标。

"""

from sprites import *                     # 从精灵模块导入所有命令
 
screen = Screen()                         # 新建屏幕
screen.bgcolor("#003278")                 # 背景颜色
redsquare = Image.new(size=(100,100),
                    mode="RGBA",
                    color=(255,0,0,255))   # 新建100x100的红色图形
redsquare.save('redsquare.png')            # 保存为图像

redsquare = Sprite("redsquare.png")        # 新建角色
redsquare.color('white')                   # 画笔颜色为白色 
redsquare.draw_grid2(4,4,100,100)          # 画4x4,宽高100x100的格子
redsquare.setleft(0)                       # 设置角色最左x坐标为0   
redsquare.settop(100)                      # 设置角色最顶y坐标为100 
left = redsquare.getleft()                 # 获取角色最左x坐标 
top = redsquare.gettop()                   # 获取角色最顶y坐标
right = redsquare.getright()               # 获取角色最右x坐标
bottom = redsquare.getbottom()             # 获取角色最下y坐标
print(left,top,right,bottom)
while True:                                # 当成立的时候
  redsquare.setright(100)                  # 设置角色最右x坐标为100 
  redsquare.wait(0.5)                      # 等待0.5秒 
  redsquare.setbottom(-100)                # 设置角色最底y坐标为-100 
  redsquare.wait(0.5)
  redsquare.setleft(-100)                  # 设置角色最左x坐标为-100 
  redsquare.wait(0.5)
  redsquare.settop(100)                    # 设置角色最顶y坐标为100 
  redsquare.wait(0.5)

 
发表在 python, sprites, turtle | 角色坐标的get和set上下左右命令已关闭评论

24位变32位,给图像增加alpha通道

"""
   24位变32位,给图像增加alpha通道
"""
from PIL import Image
import numpy as np

rgb = np.array(Image.open('24位图.png'))
print(rgb)
rgba = np.insert(
    rgb,
    3,   # 在这个索引号增加
    255, # 表示不透明
    axis=2, # 插入alpha通道的depth
)

#print(rgba)
weights = np.c_[0.2989, 0.5870, 0.1140]
tile = np.tile(weights, reps=(8,8,1))
print(tile)

发表在 python | 24位变32位,给图像增加alpha通道已关闭评论

图像处理之RGBA通道提取

李兴球Python图像处理之RGBA通道提取
以下是部分代码预览:

"""

   图像处理之RGBA通道提取。

   python精灵模块能进行图像处理吗?
   这个...,也算是可以吧,不过核心是numpy,这里只是用它的角色显示图形罢了。
   
   在sprites模块中,在新建屏幕的时候可以加布局参数。
   参数的名称叫layout,如果用Screen新建屏幕不写参数或值为1,那么一切还是海龟画图那样的布局。
   如果加了参数值为2,那么会形成左右布局,这个时候会有窗口会一分为二。
   左边的框架叫leftframe,右边的框架叫rightframe。它们的父(master)组件都是root。
   而角色所在的displayframe就在leftframe框架的上面。有一个叫bottomframe的框架
   在leftframe框架的下面。读者可在rightframe和bottomframe这两个框架中放置组件。
   这里需要tkinter知识,在turtle模块中它的缩写为TK。
   
   这个程序也可以通过im.convert('L')把图像变成灰度图。
   还可以通im = 255-im反转二维阵列用来生成负片效果。
   当然,对im进行各种转换,就能进行各种图像处理了。
   
"""
from sprites import *

def extractred():
    """提取红色通道"""
    imcopy = im.copy()
    pass
    
def extractgreen():
    """提取绿色通道"""
    imcopy = im.copy()
    pass
    
def extractblue():
    """提取蓝色通道"""
    imcopy = im.copy()
    pass

def extractalpha():
    """提取透明通道"""
    imcopy = im.copy()
    pass
    
screen = Screen(2)                          # 新建左右分区的屏幕对象
screen.setup(800,600)
screen.title('图像处理之RGBA通道提取')
root = screen._root
root.rightframe.config(padx=10,pady=10)

pic = 'maid.png'
im = np.array(Image.open(pic))                # im是一个二维阵列,每个数据是一个4元组像素点

girl = Sprite('maid.png',pos=(-300,0))        # 这是原图形
girl_red = Sprite(visible=False,pos=(-150,0)) # 准备用来显示只有红色通道的图形
girl_green = Sprite(visible=False,pos=(0,0))  # 准备用来显示只有绿色通道的图形
girl_blue= Sprite(visible=False,pos=(150,0))  # 准备用来显示只有蓝色通道的图形
girl_alpha= Sprite(visible=False,pos=(300,0)) # 准备用来显示只有alpha通道的图形

b1 = TK.Button(root.rightframe,text='红色通道',font=('黑体',12,'normal'),command=extractred)
b1.pack()
b2 = TK.Button(root.rightframe,text='绿色通道',font=('黑体',12,'normal'),command=extractgreen)
b2.pack()
b3 = TK.Button(root.rightframe,text='蓝色通道',font=('黑体',12,'normal'),command=extractblue)
b3.pack()
b4 = TK.Button(root.rightframe,text='透明通道',font=('黑体',12,'normal'),command=extractalpha)
b4.pack()

screen.mainloop()


需要全部源代码和素材,请

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

发表在 python, sprites, turtle | 图像处理之RGBA通道提取已关闭评论

RGB颜色拾取器,python rgb pixel picker

李兴球rgb颜色拾取器

"""
   RGB颜色拾取器,注意:在标题栏里显示的坐标是相对于计算机屏幕的,
   以左上角为原点的坐标,而不是虫子所在屏幕的坐标。
"""
import pyautogui
from ctypes import *
from sprites import *
from coloradd import *

screen = Screen()
screen.resizable()
screen.colormode(255)

c = (255,0,0)
ft1 = ('黑体',32,'normal')
ft2 = ('宋体',14,'normal')
bug = Sprite(visible=False,pos=(0,150))
bug.write('RGB颜色拾取器',align='center',font=ft1)
bug.goto(0,100)
bug.write('本程序可以全屏幕拾取像素点的RGB值',align='center',font=ft2)
bug.home()
bug.pensize(100)
bug.bk(180)
bug.pendown()
for x in range(360):
    bug.color(c)
    bug.fd(1)
    c = coloradd(c,1/360)
    
def get_color(x, y):
    """得到计算机屏幕x,y坐标某点的RGB颜色值"""
    gdi32 = windll.gdi32
    user32 = windll.user32
    hdc = user32.GetDC(None)  # 获取颜色值
    pixel = gdi32.GetPixel(hdc, x, y)  # 提取RGB值
    r = pixel & 0x0000ff
    g = (pixel & 0x00ff00) >> 8
    b = pixel >> 16
    return (r, g, b)

try:
    while True:
        x, y = pyautogui.position()
        c = get_color(x,y)
        info = "坐标:(" + str(x) + "," + str(y) + "),RGB值" + str(c) 
        screen.title(info)
        screen.update()
except KeyboardInterrupt:
    pass

发表在 python, sprites, turtle | RGB颜色拾取器,python rgb pixel picker已关闭评论

python像素级碰撞基本理论

在进行游戏开发的过程中,最完美的碰撞检测就是像素级碰撞检测。图像是由像素点组成的,每个像素点有4个值,分别是RGBA。
R代表红色通道,G代表绿色通道,B代表蓝色通道,A代表透明度通道。
如果A的值为0,代表这个像素点是看不见的,即完全透明。如果A的值为255,代表这个像素点是完全不透明的。
为了描述方便,这里假设有img1,它是一个png图形。它在一个屏幕中,它的最小矩形即rect1是可以求出来的。
用np.array(Image.open(img1)),返回二维阵列为im1。
我们不需要颜色信息,只要知道每个像素点到底是透明的还是不透明的即可,所以我们通过alpha1 = im1[:, :, 3]就能提取所有像素点的透明度值。还假设有img2,用np.array(Image.open(img2))返回的二维阵列为im2,它的最小绑定矩形为rect2,用同样的式子也能得到alpha2。

如果要检测img1和img2有不透明像素重叠,那么首先应该检测它们有没有重叠的矩形区域。
如果有矩形重叠,则取这个重叠区域,假设为overlapped_rect。
注意这里的rect1和rect2及overlapped_rect都是相对于整个屏幕的,如下图所示:

为了描述方便,假设重叠区域宽高都为10。把overlapped_rect矩形减去rect1就能求出重叠区域相对于rect1的子矩形。
我们把它叫sub_rect1。把它解包为left,top,right,bottom。再通过alpha1 = alpha[top:bottom,left:right],
就能求出重叠区域每个像素的透明度值。就像下面这样所示:

[[255 255 255 251   0   0   0   0   0   0]
 [255 255 255 251   0   0   0   0   0   0]
 [255 255 255 251   0   0   0   0   0   0]
 [251 251 251 251   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0 251 251 251 251 251   0]
 [  0   0   0   0 251 251 251 251 251   0]
 [  0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0]
 [  0   0   0   0   0   0   0   0   0   0]]

我们认为大于127透明度的值为不透明,所以我们把上面的进行mask1 = alpha > 127这个运算,得到以下结果:

[[1 1 1 1 0 0 0 0 0 0]
 [1 1 1 1 0 0 0 0 0 0]
 [1 1 1 1 0 0 0 0 0 0]
 [1 1 1 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 1 1 1 1 0]
 [0 0 0 0 1 1 1 1 1 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]

我们对img2也进行同样的处理,也会得到一个mask,它就包括了图像在这个子区域的透明度信息。我们把它叫遮罩,img2的mask就取名为mask2。

假设mask2如下所示:

[[0 0 0 1 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 1 1 1 1 1 0]
 [0 0 0 0 1 1 1 1 1 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0]]

如果把mask1和mask2进行相加得到mask3,那么在mask3中的值就会有2,这就说明有不透明像素重叠!
通过array = np.argwhere(mask3 == 2)就能得出所有值为2的行列号。

接下来,通过array[0]就能得到第一个碰撞点的行列号。当然,这个行列号是相对于重叠区域的行列号。
不过,我们把行列号加上重叠区域的左上角坐标就能得到碰撞点的坐标了。
当然,也能求出这个碰撞点在图形1和图形2上的像素值,只不过是一个求坐标的过程,只要加上它们的sub_rect1的坐标。
再用im的getpixel就能得到像素值,这样就能进行颜色碰撞了。

发表在 python, 杂谈 | python像素级碰撞基本理论已关闭评论

最简单的mask遮罩原理演示程序

"""
   最简单的mask遮罩原理
"""
from PIL import Image
import numpy as np

im = np.array(Image.open('xiao2.png'))

alpha = im[:, :, 3]                     # 所有透明通道的alpha值
print(alpha)
mask = alpha > 127                      # 大于127的表示不透明,否则为透明
mask.dtype=np.uint8                     # 转换成整数
print(mask)                             # 打印遮罩

pil_img = Image.fromarray(im)           # im是一个np.array
pil_img.save('保存后的.png')

发表在 python | 最简单的mask遮罩原理演示程序已关闭评论

python像素级碰撞形成mask代码(适合于python精灵模块的)

def _convertpos(x,y):
“””把x,y坐标转换回以左上角为原点的x,y坐标,和屏幕的缩放参数scale无关。”””
if Turtle._screen is None:return
screen = Screen() # 返回屏幕对象
x = x + screen.window_width() //2
y = screen.window_height() //2 – y
return x,y

def _cut_sub_rect(sprite,rect):
“””返回相对于sprite所在矩形的子矩形,当然,只适合于图像造型
这个子矩形的左上角坐标以sprite左上角坐标为原点的。
“””
left,top,right,bottom = sprite.bbox()
left1,top1 = _convertpos(left,top)
left2,top2,right2,bottom2 = rect
left2,top2 = _convertpos(left2,top2)
right2,bottom2 = _convertpos(right2,bottom2)
dleft = int(left2 – left1)
dtop = int(top2 – top1)
dright = int(right2 – left1)
dbottom = int(bottom2 – top1)
return dleft,dtop,dright,dbottom

def _make_mask(sprite,rect):
“””
坐标系以左上角为原点的,截取角色子矩形区域的alpha形成mask
最后形成的mask是一个numpy二维数组,1代表不透明区域,0代表透明区域。
“””
im = np.array(sprite._current_im) # 角色当前的图形对象转换成numpy数组

alpha = im[:, :, 3] # 提取所有透明通道的alpha值
left,top,right,bottom = _cut_sub_rect(sprite,rect)

alpha = alpha[top:bottom,left:right] # 子矩形的alpha通道所有值
mask = alpha > 127 # 127是阈值,即大于127的认为不透明
mask.dtype=np.uint8 # 转换成整数
return mask # 返回遮罩

发表在 python, sprites | python像素级碰撞形成mask代码(适合于python精灵模块的)已关闭评论

python求两个矩形重叠区域(python矩形碰撞算法基础)

注意以下的坐标系屏幕中心点为原点,而非左上角为原点,所以代码和其它地方的不一样,请看清楚哦。

def rect_overlap(rect1,rect2):
    """
        rect1:矩形1,四元组,左上角坐标和右下角坐标
        rect2:矩形2,四元组,左上角坐标和右下角坐标
        本函数返回矩形相交区域的矩形及面积
    """
    (x11,y11,x12,y12) = rect1     # 矩形1左上角(x11,y11)和右下角(x12,y12) 
    (x21,y21,x22,y22) = rect2     # 矩形2左上角(x21,y21)和右下角(x22,y22)
    
    # 下面求最小的外包矩形
    startx = min(x11,x21)         # 外包矩形在x轴上左边界
    endx = max(x12,x22)           # 外包矩形在x轴上右边界
    starty = min(y12,y22)         # 外包矩形在y轴上上边界
    endy = max(y11,y21)           # 外包矩形在y轴上下边界
    # 想像一下两个矩形隔得比较远,那么外包矩形的宽度是不是肯定大于两个矩形的宽度和呢?
    # 所以,两个矩形相交,它们的宽度和必然大于最小外包矩形的宽度,它们的高度和也是必然大于外包矩形的高度
    width = (x12-x11) + (x22-x21) - (endx-startx)      # (endx-startx)表示外包矩形的宽度
    height = (y11-y12) + (y21-y22) - (endy-starty)     # (endy-starty)表示外包矩形的高度
    #height = -height
    #print(width,height)
    if width<=0 or height<=0:    # 不相交
        return tuple()
    else:                        # 相交
        X1 = max(x11,x21)        # 有相交则相交区域位置
        Y1 = min(y11,y21)
        X2 = min(x12,x22)
        Y2 = max(y12,y22)
    
    area = width * height        # 相交区域面积
    return (X1,Y1,X2,Y2,area)

发表在 python | python求两个矩形重叠区域(python矩形碰撞算法基础)已关闭评论

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

如果简单地用Python编程绘制酷炫的图形呢?通常初入门者用Python的海龟画图模块绘制图形。我们只要导入海龟模块,就像下面这样,然后让海龟前进,就能画一个“一”字图形了。

import turtle
turtle.fd(100)

如果要让画的一字形图产生渐变效果,就像下面这样,该如何编程呢?仅靠海龟模块是无能为力了。

这时可以用一个叫coloradd的模块。这个模块里面也有一个命令,也叫coloradd。它能让颜色进行增加! 导入这个命令的代码为

from coloradd import *。

coloradd命令的参数为一个RGB三元组和一个小数。我们知道,在用RGB三元色表示颜色的时候,(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色。三元组中的第一个数据是红色份量,第二个数据是绿色份量,第三个数据是蓝色份量。它们的最小值是0,表示这种颜色份量没有,最大值为255,表示这种颜色份量为100%。比如红色+绿色,结果就是黄色,RGB大法表示为(255,255,0)。比如红色+蓝色,结果是品红色,RGB表示法为(255,0,255)。如果要使用coloradd命令,要把海龟画图中屏幕的颜色模式设为255。代码像下面这样:

screen = turtle.getscreen()
screen.colormode(255)

为了使海龟所画的彩色一字从红色开始,接着我们设定一个起始颜色,代码为:

c = (255,0,0)

上面的c是一个三元组,在海龟画图中,会被识别为红色。

为了让所画的一字更加粗一些,我们把海龟画笔的粗细设为10,代码为以下所示:

turtle.pensize(10)

coloradd命令让颜色增加的本质就是修改元组里数据的值,然后返回一个新元组。当然,这个新元组可以被识别为一种颜色。如coloradd(c,0.01),结果是(255, 15, 0)。这被当成一种颜色时,是在红色的基础上加了一点绿色,这种颜色就向橙色靠近了一些。当 c = coloradd(c,0.01)再次运行时,c的值就会不断地向着“红橙黄绿青蓝紫”的方向渐变。程序就像下面这样:

for x in range(360):
   c = coloradd(c,0.01)

我们可以把上面的c都打印出来,能够看到一些三元组,它们表示的颜色就是从红色到紫色。这样不太直观,我们可以把这些颜色都设为海龟画笔的颜色,然后让海龟前进1个单位,这样就能把颜色显示出来了。

最后,全部代码如下所示:

import turtle
from coloradd import *

screen = turtle.getscreen()
screen.colormode(255)

c = (255,0,0)
turtle.pensize(10)

for x in range(360):
    turtle.color(c)
    c = coloradd(c,0.01)
    turtle.fd(1)


运行结果如下所示:

​使用python的coloradd模块制作如意金箍棒的运行结果

发表在 python, turtle, 杂谈 | 用Python制作酷炫图形之如意金箍棒_颜色增加模块应用已关闭评论

跳跃方块爬墙平台游戏核心.py


以下是部分代码预览:

"""
   跳跃方块爬墙平台游戏核心.py
   
   一个方块,按向上箭头会跳起来或爬墙,当然,不能连跳。
   按左右键头会左右移动,当碰到垂直障碍物会停止,碰到水平障碍物会停下。
   游戏中的平台是画出来的,你可以很容易地把它变成一个更加好玩有趣的游戏,
   如多关卡,接金币,创意都是自己想的,这里提供基础核心代码。
   
   本游戏需要Python精灵模块1.34版本支持。
   升级Python精灵模块最新版本命令:
   pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sprites    --upgrade 
   安装方法 pip install sprites
   如遇到困难,联系李兴球,微信scratch8,
   网址:www.lixingqiu.com
"""

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

screen = Screen()                      # 新建屏幕
screen.setup(800,600)                  # 设定屏幕宽高
screen.bgpic('background.jpg')         # 设定背景图像

screen.title('跳跃方块爬墙平台游戏核心by李兴球')

square = Sprite(shape='square.png',pos=(-200,400))
square.dx = 0                           # 水平速度
square.dy = 0                           # 垂直速度

jumpkey = Key('Up')                     # 向上方向箭头
leftkey = Key('Left')                   # 向左方向箭头
rightkey = Key('Right')                 # 向右方向箭头
spacekey = Key('space')                 # 空格键
screen.listen()                         # 监听按键

bug = Sprite(visible=False)             # 用于画地板的隐藏虫子
bug.color('white')                      # 虫子所画的平台为白色的
floors = []                             # 地板们

# 下面是画第一个平台的代码
bug.bottomleft()                        # 到左下角
bug.addy(100)                           # 虫子的y坐标增加100
x,y = bug.pos()
coords = [(x+600,y),(x+600,y+10),(x,y+10)]
f1 = bug.polygon(coords)                # 以角色坐标为第一个点,coords为其它点画多边形
floors.append(f1)                       # 把名为f1的平台添加到floors列表

# 下面是画第二个平台的代码
bug.home()                              # 到屏幕原点
bug.addy(-50)
x,y = bug.pos()
coords = [(x+150,y),(x+150,y+10),(x,y+10)]
f2 = bug.polygon(coords)                # 以角色坐标为第一个点,coords为其它点画多边形
floors.append(f2)

# 下面是画第三个平台的代码
bug.goto(0,100)                         # 到坐标点(0,100)
x,y = bug.pos()
coords = [(x+150,y),(x+150,y+10),(x,y+10)]
f3 = bug.polygon(coords)                # 以角色坐标为第一个点,coords为其它点画多边形
floors.append(f3)

# 下面是画第四个平台的代码
bug.goto(-200,-200)                     # 到屏幕原点
x,y = bug.pos()
coords = [(x+10,y),(x+10,y+300),(x,y+300)]
f4 = bug.polygon(coords)                # 以角色坐标为第一个点,coords为其它点画多边形
floors.append(f4)

running = True
clock = Clock()

while running:
    # 处理重力加速度
    
    以下代码省略......

    screen.update()                 # 更新屏幕显示
    clock.tick(60)                  # 固定fps为60

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

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

发表在 python, sprites, turtle | 跳跃方块爬墙平台游戏核心.py已关闭评论

vpython自由落体跳跃小球_python3D

以下是部分代码预览:

"""
 vpython自由落体跳跃小球
 本程序需要vpython支持,这主要是用来做3D动画的。
 安装方法pip install vpython
 操作方法,按左键往x负方向移动,按右键往x正方向移动。
 按向上方向箭头小球会跳跃。
"""
from vpython import *

size = 1     # 小球半径
h = 15       # 小球离地的高度
g = 9.8      # 重力加速度 9.8 m/s^2
t = 0        # 起始时间
dt = 0.001   # 时间间隔

# 新建场景,标题,宽度,高度,x坐标,y坐标,观察者坐标(摄像头),背景颜色
scene = canvas(title="vpython自由落体跳跃小球", width=600, height=600, x=0, y=0, center=vec(0, h/2, 0), background=vec(0.5, 0.6, 0.7))
# 新建一个方块,做为地板(小球参照物),坐标,尺寸(长高宽),颜色
floor = box(pos=vec(0, 0, 0), size=vec(40, 0.01, 10), color=color.blue)
# 新建小球,坐标,半径,颜色,速度向量,加速度向量
ball = sphere(pos=vec(0, h, 0), radius=size, color=color.red, v=vec(0, 0, 0), a=vec(0, -g, 0))

while True:
    rate(1000)
    ball.v += ball.a*dt                # 速度随着时间的推移在重力作用下其绝对值越来越大

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

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

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

发表在 python | vpython自由落体跳跃小球_python3D已关闭评论

换桶接方块游戏


一个有趣,好玩的思维训练小游戏,用Python精灵模块开发,以下是可执行文件下载网址:

链接:https://pan.baidu.com/s/1Awjj72wIkPFbUbsLW7nj4A
提取码:yzcm

以下是部分代码预览:

"""
   换桶接方块游戏.py
   操作方法,单击屏幕,交换颜色桶的位置,让方块落入相应颜色的桶中,
   如果落入同样颜色桶中,则加10分,否则生命数减一。
   随着方块的移动速度越快,游戏难度会越来越大!
   本程序由于配音的需要,借用了pygame的混音器,所以也要安装pygame模块,
   安装方法pip install pygame
   python精灵模块安装方法: pip install sprites
"""
from sprites import *
from pygame import mixer

def swapbuck(index1,index2):
    """交换桶的位置"""
    # 以下是交换桶的坐标
    x1,y1 = bucks[index1].pos()
    x2,y2 = bucks[index2].pos()
    bucks[index1].goto(x2,y2)
    bucks[index2].goto(x1,y1)
    # 以下是交换列表中‘桶’的索引位置
    bucks[index1],bucks[index2] = bucks[index2],bucks[index1]
    while  leftkey.down():screen.update()
    
def makesquare():
    """随机产生一个方块"""
    r = random.randint(1,4)
    if r == 1:
       sq = Sprite('res/redfk.png',tag='red',pos=(random.choice(xcors),180))
    elif r == 2:
        sq = Sprite('res/yellowfk.png',tag='yellow',pos=(random.choice(xcors),180))
    elif r == 3:
        sq = Sprite('res/greenfk.png',tag='green',pos=(random.choice(xcors),180))
    elif r == 4:
        sq = Sprite('res/bluefk.png',tag='blue',pos=(random.choice(xcors),180))        
    squares.append(sq)
    
def removesquare():
    """移去到底的方块
       遍历每个方块,如果到桶上了,则判断到了哪个桶上,
       然后判断它们的标签是否相等,如果相等,则加10分,否则爆炸!
    """
    global score,lives,speed                              # 得分和生命数与速度为全局变量 
    for sq in squares[:]:
        if sq.ycor() < -100:
            item = sq.find_overlapping()                  # 查找方块碰到的所有item
            item = list(item)[0]                          # 这里只有一个,所以取索引为0的
            这里的代码省略.....

mixer.init()                                              # 初始化混音器
success1 = mixer.Sound('res/success1.wav')                # 成功1音效
success2 = mixer.Sound('res/success2.wav')                # 成功2音效
success3 = mixer.Sound('res/success3.wav')                # 成功3音效
success4 = mixer.Sound('res/success4.wav')                # 成功4音效
snd_success = [success1,success2,success3,success4]       # 放入列表以便随机选取
snd_explode = mixer.Sound('res/explode.wav')              # 爆炸音效   

screen = Screen()
screen.setup(480,360)
screen.bgcolor('#393837')
screen.title('换桶接方块游戏')
screen.bgpic('res/cover.png')                            # 显示封面
spacekey = Key('space')                                  # 空格按键
screen.listen()                                          # 监听屏幕按键
PlaySound('res/menu.wav',SND_LOOP|SND_ASYNC)             # 循环播放背景音乐

while not spacekey.down():screen.update()                # 等待空格键被按下
screen.bgpic('nopic')                                    # 取消封面
PlaySound('',SND_PURGE)                                  # 停止播放声音  

PlaySound('res/game.wav',SND_LOOP|SND_ASYNC)             # 循环播放背景音乐
这里的代码省略.....

swap = Sprite('res/swap-arrow.png',pos=(0,-50)) # 交换指示杠
leftkey = Mouse()                               # 鼠标左键
squares = []                                    # 所有方块列表
clock = Clock()                                 # 时钟对象
score = 0                                       # 得分
lives = 3                                       # 生命数
speed = 2                                       # 下移速度 


这里的代码省略.....
    
swap.hide()                                   # 隐藏交换指示杠
[buck.hide() for buck in bucks]               # 隐藏每只桶
screen.bgpic('res/gameover.png')              # 显示新的背景
PlaySound('',SND_PURGE)                       # 停止播放声音  
PlaySound('res/gameover.wav',SND_LOOP|SND_ASYNC)
screen.mainloop()

想探究本程序原理,请下载完整源代码与素材,

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

发表在 python, sprites, turtle | 换桶接方块游戏已关闭评论

跳跃方块避障游戏.py

以下是部分代码预览:

"""
   跳跃方块避障游戏.py
   一个方块,按向上箭头会跳起来,按向下箭头会加速下落。
   还会有一些障碍物不断地从屏幕右边冒出来。
   游戏的逻辑就是避开这些障碍,谁玩得久,谁就是冠军。
   请修改代码自行调整游戏难度,如可以让多边形障碍从屏幕下方出现的机率更大。
   
   本游戏需要Python精灵模块1.33版本支持。
   安装方法 pip install sprites
   如遇到困难,联系李兴球,微信scratch8,
   网址:www.lixingqiu.com
"""

from sprites import *

def makepolygon():
    """随机产生一个多边形,加入列表"""
    global zais
    bug.randomcolor()            # 设定随机颜色
    bug.goto(400,random.randint(-360,360))
    zais.append(bug.polygon())   # 加到障碍物列表
    
def movepolygon():
    """移动每个多边形"""
    global zais
    [screen.cv.move(p,-5,0) for p in zais]

def removepolygon():
    """移除超出边界的多边形"""
    global zais
    for p in zais:
        pos = screen.cv.coords(p)
        right = max(pos[::2])     # 最右边x坐标
        if right<-480:
            screen.cv.delete(p)   # 从画布中删除这个item
            zais.remove(p)        # 在列表中移除这个item
            
def collidecheck():
    '''和所有多边形的碰撞检测'''
    global zais,running
    if square.overlap_with(zais):
         running = False
         
screen = Screen()
screen.setup(960,720)
screen.bgpic('backdrop1.png')
screen.title('跳跃方块避障游戏by李兴球')

PlaySound('Floating With You.wav',SND_ASYNC|SND_LOOP)

# 这个角色用来画从右往左移动的多边形
bug = Sprite(visible=False,pos=(400,0))

# 这个角色用来显示逝去的时间
w = Sprite(visible=False,pos=(0,250))

square = Sprite('square.png',pos=(-200,0))
square.dy = 0

zais = []                               # 障碍物列表
jumpkey = Key('Up')                     # 向上方向箭头
downkey = Key('Down')                   # 向下方向箭头
spacekey = Key('space')                 # 空格键
screen.listen()                         # 监听按键

while True:
    chance = 110                        # 控制多边形出现概率的整数
    running = True
    clock = Clock()
    start = time.time()                 # 起始时间
    framecounter =0                     # 帧计数器
    while running:
        framecounter +=1                # 统计帧数 
        esctime = time.time() - start   # 逝去的时间
        esctime = round(esctime)        # 四舍五入
        if framecounter % 60 == 0 :
           w.clear()
           w.write(esctime,align='center',font=('',48,'normal'))
        # 随着游戏的进行,机率越来越大了,游戏也就越来越难


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


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

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

发表在 python, sprites, turtle | 跳跃方块避障游戏.py已关闭评论

numpy与pillolw像素操作学习代码

from PIL import Image
import numpy as np

im = np.array(Image.open('xiao.png'))

im_i = 255 - im     # 直接反转所有像素值(底片效果)
 
print(im.dtype)     # uint8

print(im.ndim)      # 3

print(im.shape)     # (512, 512, 3)

alpha = im[:, :, 3] # 所有透明通道的alpha值


pil_img = Image.fromarray(im)    # im是一个np.array
pil_img.save('保存后的.png')
发表在 python | numpy与pillolw像素操作学习代码已关闭评论

地图破坏者(打方块)


以下是部分代码预览:

"""
   地图破坏者,
   这个程序演示的是如何把游戏中的地图进行破坏,
   这些方块都是图章,它们碰到子弹会消失。
   如果把箭头换成坦克,操作坦克移动,加上敌人坦克,
   那么就可以变成坦克大战游戏了。
"""
from sprites import *

# 新建50X50像素的图形,用来代表砖块
img = Image.new("RGBA",(50,50),color='brown')
img.save('square.png')

screen = Screen()                 # 新建屏幕
screen.title('地图破坏者')

square = Sprite('square.png')     # 新建棕色方块
square.goto(-300,300)
for _ in range(4):                # 迭代4次
    for x in range(10):           # 在范围10迭代x
        square.stamp()            # 盖图章
        square.fd(60)             # 前进60个单位 
    square.right(90)              # 向右转90度

square.goto(-180,180)
for _ in range(4):                # 迭代4次
    for x in range(6):            # 在范围6迭代x
        square.stamp()            # 盖图章
        square.fd(60)             # 前进60个单位 
    square.right(90)              # 向右转90度
    
bricks = square.stampItems        # 砖块们

square.home()                     # 到原点
square.shape('pointer')           # 变形为指针 

# 此角色作为子弹
circle = Sprite('circle',visible=False)

leftkey = Mouse()                 # 鼠标左键
clock = Clock()                   # 时钟对象
shoot = False                     # 控制发射的逻辑变量


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

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

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

发表在 python, sprites, turtle | 地图破坏者(打方块)已关闭评论

给Sprite类加方法(迷宫碰撞)


以下是部分代码预览:

"""
   给Sprite类加方法(迷宫碰撞)
   本程序给Sprite类增加了一个叫spiral的方法,
   这样,所有生成的角色都有了这样一个方法,
   当然,用同样的道理,可以重定义现有的Sprite类的方法。
   本程序画了一个迷宫,还演示了如何使用find_overlapping方法。
   注意在下面的程序中是如何使用items列表的。
"""
from sprites import *

此处代码省略......

screen = Screen()           # 新建屏幕
bug = Sprite()              # 新建虫子角色
bug.color('blue')           # 虫子的画笔颜色
bug.pensize(2)              # 画笔粗细
bug.pendown()               # 落笔
bug.spiral(20)              # 画图形
bug.penup()                 # 抬笔   

此处代码省略......

leftkey = Key("Left")       # 新建左方向箭头实例
rightkey = Key("Right")     # 新建右方向箭头实例
upkey = Key("Up")           # 新建上方向箭头实例
downkey = Key("Down")       # 新建下方向箭头实例
screen.listen()             # 监听屏幕按键

clock = Clock()             # 新建时钟对象 
while True:
    if leftkey.down():      # 如果按了左方向箭头
        bug.setheading(180) # 面向左的方向 
        bug.addx(-5)        # x坐标减小
        if bug.find_overlapping(maze):bug.addx(5)
    if rightkey.down():
        bug.setheading(0)
        bug.addx(5)
        if bug.find_overlapping(maze):bug.addx(-5)
    if upkey.down():
        bug.setheading(90)
        bug.addy(5)
        if bug.find_overlapping(maze):bug.addy(-5)
    if downkey.down():
        bug.setheading(-90)
        bug.addy(-5)
        if bug.find_overlapping(maze):bug.addy(5)
    screen.update()
    clock.tick(30)           # 设定fps为30帧
    

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

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

发表在 python, sprites, turtle | 给Sprite类加方法(迷宫碰撞)已关闭评论

探照灯手电筒.py

以下是部分代码预览:

"""
   探照灯手电筒.py
"""

from sprites import *

screen = Screen()
screen.bgcolor('black')
screen.setup(474,387)

flashlight = Sprite(shape='flashlight2.png')
screen.bgpic('王子公主.jpg')


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

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

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

发表在 python, sprites, turtle | 探照灯手电筒.py已关闭评论

pygame图像处理_隐形的海龟笔


本人2018年写的pygame图像处理代码,免费发给读者。

import pygame
from math import sin,cos,radians

class Durtle():
    """Durtle取名自Draw与turtle的组合,它是用来生成图像的"""
    def __init__(self,image,heading = 0,width=1,color=(0,0,0)):
        self.__pensize__ = width                          # 笔迹宽度,对应的是draw.circle的半径
        self.__color__ = color                            # rgb255颜色        
        self.__image__ = image                            # 在哪个图像上画 
        self.__heading__ = heading
        self.__imagerect__ = self.__image__.get_rect()    # 获取图像的rect,描述坐标与长高的        
        self.__width__ = self.__imagerect__.width         # 图像的宽
        self.__height__ = self.__imagerect__.height       # 图像的高
         
        self.x = self.__width__//2                        # 起始x坐标
        self.y = self.__height__//2                       # 起始y坐标

    def setheading(self,heading):
        """设定方向,以0度为向右,90度为向上,180度为向左,270度为向下"""
        self.__heading__ = heading
        
    def right(self,angle):
        """右转"""
        self.__heading__ = (self.__heading__ - angle) % 360
        
    def left(self,angle):
        """左转"""
        self.__heading__ = (self.__heading__ + angle) % 360
        
    def forward(self,step):
        """朝当前方向移动step像素"""
        if step == 0 :return
        length = abs(step)        
        k = length / step   
        for i in range(length):
          pygame.draw.circle(self.__image__,self.__color__,(int(self.x),int(self.y)),self.__pensize__)
          self.x = self.x + k * cos(radians(self.__heading__))
          self.y = self.y - k * sin(radians(self.__heading__))            
         
    def save(self,filename = "test_demo2.png"):
        pygame.image.save(self.__image__,filename)            
             

if __name__ == "__main__":
    
    image = pygame.Surface((1024,1024),pygame.SRCALPHA,32) #创建透明图像
    p =Durtle(image,30,2,(15,250,55))

    for i in range(36):
        p.forward(100)
        p.forward(-100)
        p.right(10)
        
    p.save()
    


发表在 pygame, python | pygame图像处理_隐形的海龟笔已关闭评论

pygame图像处理_生成3D球

这个程序用pygame的图层技术、配合colorsys相关命令,生成像3D一样的球图形。

以下是部分代码预览:

import pygame
import colorsys,os

def lightadd(color,dv):    
    h,s,v = colorsys.rgb_to_hsv(color[0]/255,color[1]/255,color[2]/255)
    v = v + dv  
    r,g,b = colorsys.hsv_to_rgb(h,s,v)
    return int(r*255)%256,int(g*255)%256,int(b*255)%256   

def makeball(color,folder):
    """生成3D球"""
    radius = 512
    for r in range(radius//4,0,-1):
        color = lightadd(color,0.01)     
        pygame.draw.circle(image,color,(512,512),r*4)
    
    以下代码省略......

if __name__ == "__main__":

   color_list = (255,0,0),(0,255,0),(0,0,255),(255,255,0),(0,255,255),(255,0,255),(255,255,255)
   for i in range(len(color_list)):
       fdname  = "images" + str(i)
       if not os.path.exists(fdname) :os.mkdir(fdname)
       makeball(color_list[i],fdname)

提供了几个版本,以供学习者方便学习,下载完整源代码与素材,请

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

发表在 pygame, python | pygame图像处理_生成3D球已关闭评论

用Python做3D动画教程打包免费下载

这是台湾王一哲老师写的教程,在这里免费提供给有需要的人学习Python的3D编程。

链接:https://pan.baidu.com/s/1rCaWcdKZMMadtuueGY-A5w
提取码:y4bh

 

——————————————————————

以下是教程样例,学过Python基础的忽略….

 

# Python基本语法

> 作者:王一哲
> 日期:2018/3/6

 

## 判断条件:if

最简单的语法为

“`python
if(条件):
条件成立时执行的程式码
“`

当条件成立时执行冒号下的程式码,程式码必须从if 的位置开始缩排,假设使用的缩排为4 个空格,则在条件成立时要执行的程式码每行都要缩排4 个空格,若某一行没有缩排,从此行开始会被视为if 的部分已经结束。如果条件成立时执行的程式码只有一行,可以直接放在冒号之后不需换行。

如果要加上条件不成立时执行的程式码,语法为

“`python
if(条件):
条件成立时执行的程式码
else:
条件不成立时执行的程式码
“`

 

if … else … 流程图

 

如果条件不只有一个,可以使用多层的if,语法为

“`python
if(条件1):
条件1成立时执行的程式码
elif(条件2):
条件1不成立、条件2成立时执行的程式码
else:
条件1、2皆不成立时执行的程式码
“`

 

if … elif … else … 流程图

 

## 程式2-1:if 的使用方法

“`python=
a = int(input(“a = “))
b = int(input(“b = “))

if(a > b):
print(“a > b”)
else:
print(“a <= b”) if(a > b):
print(“a > b”)
elif(a == b):
print(“a = b”)
else:
print(“a < b”)

“` 执行时先由使用者用键盘输入a、b 的值,由于输入的资料会被视为字串,加上int 将字串转换为整数。虽然Python 在输入的资料看起来很像数字时,会自动将输入的资料格式转换为数字,但是加上int 强制转换为数字是比较保险的作法。第一个if 是:当a > b 时印出文字a > b,若条件不成立则印出文字a <= b。第二个if 是:当a > b 时印出文字a > b,当a == b 时印出文字a = b,若条件不成立则印出文字a < b。

在Python、C、C++及大部分的程式语言当中,**等号= 用来指定数值给变数**,例如a = 2 是将2 这个数值指定给变数a;**若要比较两个变数是否相等,要使用==**,这与数学式子的写法不相同,需要适应一下。

## 重复执行:while 循环

在程序语言当中经常会重复执行某一段程式码,这样的语法称为**循环(loop)**,其中一种循环称为**while**,语法为

“`python
while(条件):
条件成立时执行的程序代码
“`

当条件成立时执行冒号下的程序代码,一直重复执行到条件不成立时为止。条件成立时执行的程序代一样要注意代码缩排的空格数。while 循环的流程图如下:

 

while 循环流程图

 

## 程序2-2:while 的使用方法

“`python=
result = 0
i = 1
n = 10

while(i <= n):
print(“i = “, i)
result += i
i += 1

print(“result = “, result)
“`

先定义变数i、n、result 指定数值。当i <= n 时执行while 回圈中的程式码,印出i 的数值、将result 的数值+i 并重新指定给result,将i 数值+1 并重新指定给i。当while 回圈执行完之后印出文字result = 以及result 的数值。这个程式是用来计算1 + 2 + 3 + … + 10 = ? > 问题:如果想计算的是1 + 3 + 5 + 7 + 9 = ? 要怎么写呢?(提示:只要改一个地方即可。)

 

## 重复执行:for 循环

Python 的for 循环和其它的程式语言很不一样,比较像是用来从一串资料中依序读取当中的元素来运算,经常搭配range 或串列(list)资料一起使用。以搭配range 为例

“`python
for i in range(5):
print(i)
“`

range是用来产生数列的函式,格式为
“`python
range(起始值, 结束值, 增量)
“`
起始值预设为0,增量预设为1,但产生的数列不包含结束值。因此上面的程式码执行时,会将ragne(5) 产生的数列(0, 1, 2, 3, 4) 依序读取出来并指定给变数i,最后将印出i 的数值,因此执行结果为

“`python
0
1
2
3
4
“`

 

for 循环流程图

 

## 程序2-3:for 的使用方法

“`python=
result = 0

for i in range(1, 11):
result += i

print(“result = “, result)
“`

这个程序和程序2-2 一样是用来计算1 + 2 + 3 + … + 10 = ?

> 问题:如果想计算的是1 + 3 + 5 + 7 + 9 = ? 要怎么写呢?(提示:只要改一个地方即可。)

 

## 结语

Python 的功能非常多,但是我们的目标是利用VPython 做物理模拟动画,我们只需要if、while、for 再加上一些储存资料的容器就够用了,在之后的动画教学中会慢慢介绍更多不同的格式。

##

发表在 python, 杂谈 | 用Python做3D动画教程打包免费下载已关闭评论