初识python:tkinter 实现 弹球小游戏(非面相对象)
通过 tkinter 采用非面相对象式实现弹球小游戏(使用蹩脚式面相对象实现)。
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter,time,random x = 1
y = 1
score = 0 # 分数
level = 1 # 关卡 # 创建颜色列表
color_li = ['#feeeed','#f391a9','#fab27b','#454926','#181d4b','#a3cf62','#45b97c','#008792','#2585a6'] # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=600,height=500,bd=0) # 创建一个“画布” # 创建画布组件 filename = tkinter.PhotoImage(file="bg.png") # 获取一张图片
canvas.create_image(300, 250,image=filename) # 将图片添加到画布,作为背景 id_ball = canvas.create_oval(10, 10, 30, 30, fill=random.choice(color_li),width=0) # 定义一个球
id_paddle = canvas.create_rectangle(0,400,150,420,fill=random.choice(color_li),width=0) # 定义木板
canvas.move(id_paddle,225,0)
canvas.create_text(400, 20, text='关卡:',fill='white',font=('宋体', '20'))
canvas.create_text(500, 20, text='得分:',fill='white',font=('宋体', '20')) id_level = canvas.create_text(450, 20, text=1,fill='white',font=('宋体', '20'))
id_score = canvas.create_text(550, 20, text=0,fill='white',font=('宋体', '20'))
id_start_game = canvas.create_text(300,200,text='Start Game.',font=('宋体', '30'),fill=random.choice(color_li)) canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 wh = canvas.winfo_height() # 获取窗口高度(update刷新之后才能获取)
ww = canvas.winfo_width() # 获取窗口宽度(update刷新之后才能获取) def turn_left(event):
canvas.move(id_paddle, -10, 0) def turn_right(event):
canvas.move(id_paddle, 10, 0) def start_game(event):
canvas.move(id_start_game,0,10) canvas.bind_all('<KeyPress-Left>', turn_left)
canvas.bind_all('<KeyPress-Right>', turn_right)
canvas.bind_all('<Button-1>', start_game) # 保持起始界面
while 1:
tk.update() # 刷新窗口
p_start_game = canvas.coords(id_start_game)
print(p_start_game)
if p_start_game[1] == 210:
canvas.delete(id_start_game)
break # 让球跑起来
while 1:
tk.update() # 刷新窗口
time.sleep(0.01/level) # 通过level控制速度(也考虑过用球的颜色控制速度)
p_ball = canvas.coords(id_ball) # 获取球当前位置坐标
p_paddle = canvas.coords(id_paddle) # 获取木板的坐标 print('当前坐标:',p_ball) # 打印当前坐标
if p_ball[0] <= 0: # 当球落到右边框时:左上角x坐标判断
x = 1
elif p_ball[2] >= ww: # 当球落到右边框时,右下角x坐标判断
x = -1
if p_ball[1] <= 0: # 当球落到上边框时,左上角y坐标判断
y = 1
elif p_ball[3] >= wh: # 当球落到下边框时,右下角y坐标判断
y = -1
print(p_ball[2],p_paddle[0],p_paddle[2],p_ball[3])
if p_ball[2]>=p_paddle[0] and p_ball[2]<=p_paddle[2] and p_ball[3] == p_paddle[1]: # 球与模板接触:球的右下角x坐标在木板右上角x坐标内,且球的右下角x坐标在木板左下角x坐标内,球的右下角y坐标等于木板的左上角y坐标
y = -1 # 让球向上移动
score += 10 # 得分加10分
canvas.itemconfig(id_ball, fill=random.choice(color_li)) # 修改球的颜色,随机颜色
canvas.itemconfig(id_paddle, fill=random.choice(color_li)) # 修改木板的颜色,随机颜色
canvas.itemconfig(id_score, text=score) # 修改分数
if score > 0 and score % 50 == 0: # 每50分升一级
level += 1 # 升级
canvas.itemconfig(id_level, text=level) # 修改等级
canvas.move(id_ball, x, y) # 移动
if p_ball[3] == wh: # 当球与下边框接触时,游戏失败。
canvas.create_text(300, 250, text='Game Over !', font=('宋体', '30'), fill='red') # 添加游戏结束界面
break # 游戏结束,继续保持界面
tk.mainloop()
弹球小游戏
最终执行效果:
知识点
1、导入模块
import tkinter
2、生明一个tkinter实例(创建一个“窗口”)
tk = tkinter.Tk() # 声明一个tkinter,初始化一个“窗口”(画一个窗口)
3、设置窗口属性
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前
wm_attributes 可选属性字段:
-topmost 是否是一个永远最前的窗口
-alpha 窗口的透明度
-fullscreen 窗口是否满屏显示
-disabled 窗口是否是一个不可用的状态(不能有任何操作)
4、组件实例
首先弄清楚坐标概念:
以画布的左上角为原点(0,0)
以画一个圆为例,需要通过“矩形”的左上角、右下角两个坐标确定这个“矩形”的位置、大小,然后,在矩形中画这个圆
tkinter.Canvas 创建画布:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建“画布”
执行结果:
画布属性:
move 移动
delete 删除
winfo_height 获取窗口高度(update刷新之后才能获取)
winfo_width() 获取窗口宽度(update刷新之后才能获取)
coords 获取目标当前坐标
itemconfig 修改组件属性
画布组件:
画布组件属性:
fill 填充颜色,默认不填充
stipple 位图平铺填充
outline 边框颜色
width 边框宽度,默认1
dash 边框使用虚线。单独整数:虚线线段长度 (n1,n2,n3):线段的长度n1,间隔长度n2,虚线长度n3
arrowshape 指定箭头形状。该选项是一个形如 "20 20 10" 的字符串,字符串中的三个整数依次指定填充长度、箭头长度、箭头宽度。
joinstyle 直线连接点的风格: miter、round、bevel
state 指定该画布对象的状态 NORMAL(正常,默认),DISABLED(不可用,不响应事件)和 HIDDEN(隐藏)
canvas.create_arc 创建扇形:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 canvas.create_arc(0,0,100,100,start=0,extent=60,fill='red') # 指定坐标(左上、右下),开始度数,要画的度数,填充颜色
# style PIESLICE - 扇形、CHORD - 弓形、ARC - 只画一个弧)
# start 扇形的起始角度,以3点钟位置为0度,逆时针方向增加度数。
# extent 扇形要绘制的度数 canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建扇形
执行结果:
canvas.create_oval 创建圆:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 # 创建圆
canvas.create_oval(10,10,100,100,fill='red') canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建圆
执行结果:
canvascreate_image 创建图像
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 # 创建图像
filename = tkinter.PhotoImage(file="cat.png")
canvas.create_image(10, 20, anchor='nw', image=filename) # 西距离边框10,北距离边框20 canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建图像
执行结果:
canvas.create_line 创建线条
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 # line 线条
canvas.create_line(0,0,100,100,50,60,200,300,arrow='last',joinstyle='bevel') # 多个坐标会连续画
# arrow 两端是否有箭头(none:两端无箭头、first:开始端有箭头、last:结束端有箭头、both:两端都有箭头。 canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建线条
执行结果:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 # rectangle 矩形
canvas.create_rectangle(0,10,100,150,fill='blue',outline='red',stipple='error',width=10,dash=(10,50,100))
# stipple 位图平铺填充
# outline 边框颜色
# width 边框宽度,默认1
# dash 边框使用虚线。单独整数:虚线线段长度 (n1,n2,n3):虚线线段长度n1,间隔长度n2,虚线长度n3 canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建矩形
执行结果:
创建多边形:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 # polygon 多边形
canvas.create_polygon(0,0,100,200,100,250,50,300,fill='red',outline='red',stipple='error',width=10,dash=(10,50,100)) canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建多边形
执行结果:
创建文字:
#!/user/bin env python
# author:Simple-Sir
# time:2020/8/3 17:12
import tkinter # 创建窗口
tk = tkinter.Tk() # 声明一个TK,初始化一个“窗口”(画一个窗口)
tk.title('弹球游戏') # 窗口名称
tk.resizable(width=False,height=False) # 窗口是否可变(长、宽),也可用0,1表示
tk.wm_attributes('-topmost',1) # 窗口永远在前 # 创建画布
canvas = tkinter.Canvas(tk,width=300,height=200,bd=0) # 创建一个“画布”
# width 宽
# height 高
# bd 边框宽度(像素)
# bg 背景颜色
# highlightthickness 颜色高亮 canvas.create_text(100,100,text='使用text绘制文字',font='宋体',fill='red',anchor='n',justify='left',)
# justify 文字的对齐方式:center、left、right canvas.pack() # 将画布添加到窗口中
tk.update() # 刷新窗口 # 进入消息循环
tk.mainloop() # 所有GUI程序都必须有一个主循环
创建文字
执行结果:
事件
三种绑定方式:
canvas.bind() # 绑定到某一个组件上
canvas.bind_all() # 绑定到所有组件上
canvas.bind_class() # 绑定到某一类组件上
键盘事件:
<Left>
<Right>
<Up>
<Down>
<BackSpace>
<Delete>
<Tab>
<Return>
<Shift_L>
<Shift_R>
<Control_L>
<Control_R>
<Alt_L>
<Alt_R>
<Home>
<Key> 或者 <KeyPress> 任意键盘按键
鼠标事件
<Button-1> 鼠标点击(1-左键,2-中键,3-右键)
<Double-Button-1> 鼠标双击(1-左键,2-中键,3-右键)
<B1-Motion> 鼠标拖动(1-左键,2-中键,3-右键)
<ButtonRelease-1> 鼠标按下之后释放(1-左键,2-中键,3-右键)
<Enter> 鼠标进入控件范围
<Leave> 鼠标离开控件范围
初识python:tkinter 实现 弹球小游戏(非面相对象)的更多相关文章
- 初识python:tkinter 实现 弹球小游戏(面向对象)
使用蹩脚式面相对象,实现弹球小游戏(非面向对象实现,主要介绍tk基础用法). #!/user/bin env python # author:Simple-Sir # time:2020/8/7 10 ...
- 用Python设计一个经典小游戏
这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...
- java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图. Graphics常用的画图方法如下: drawLine(): ...
- Python开发接水果小游戏
我研发的Python游戏引擎Pylash已经更新到1.4了.如今我们就来使用它完毕一个极其简单的小游戏:接水果. 下面是游戏截图: 游戏操作说明:点击屏幕左右两边或者使用键盘方向键控制人物移动.使人物 ...
- python【控制台】小游戏--贪吃蛇
传统贪吃蛇相信大家都玩过,也是一款很老很经典的游戏,今天我们用python控制台实现 项目有很多bug没有解决,因为本人一时兴起写的一个小游戏,所以只是实现可玩部分功能,并没有花较多的时间和精力去维护 ...
- python成语接龙小游戏
上一篇讲了小游戏的坑现在把源码放出来 #coding:utf-8 import string import pypinyin import sys import random print(" ...
- java_弹球小游戏
弹球游戏实现原理: 隔一定时间(小于1秒)重新绘制图像,因为Graphics类是一个抽象类,创建子类的时候需要把所有涉及的方法都得重写,所以这里使用的是创建Canvas的子类,只需要重写它的paint ...
- Python: tkinter实例改名小工具
#!/usr/bin/env python #coding=utf-8 # # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) # 本代码以MIT ...
- 【Python】猜数小游戏(文件操作)
人生苦短,我用Python 关键词 1.多用户 2.字典记录所有成绩 3.每次游戏轮数&总游戏次数&平均每次游戏需要多少轮 字典Dictionary.列表List.元组Tuple差异化 ...
随机推荐
- 【Services】【Web】【apr】安装apr
1. 基础: 1.1 描述:apr全称Apache Portable Runtime,常用于与ssl相关的环境支持,比如openssl,httpd,nginx,tomcat 1.2 链接: 官方网站: ...
- 观察者模式之spring事件机制
ddsspring中的事件机制使用到设计模式中的观察者模式 ,观察者模式有两个概念,1.观察者.被观察者.2.被观察者做出相应得动作,观察者能接收到.不分析设计模式,学习下spring中的事件机制实际 ...
- 【Linux】【CentOS7】免密登录突然失效
[报错解决]免密登录突然失效 哔哩哔哩 萌狼蓝天 博客:萌狼工作室-博客园 [问题描述] 原本配置好了的免密登录,今天启动hadoop发现免密登录失效了 [解决方案] 1.切换到管理员模式,进入配置文 ...
- 重新整理 .net core 实践篇——— UseEndpoints中间件[四十八]
前言 前文已经提及到了endponint 是怎么匹配到的,也就是说在UseRouting 之后的中间件都能获取到endpoint了,如果能够匹配到的话,那么UseEndpoints又做了什么呢?它是如 ...
- shell脚本 mysql-binlog分析
一.简介 介绍 分析binlog工具,现有功能: 基于业务表分析统计各个表的dml的次数. 各个业务表的最后访问时间. 各dml总的次数. 该binlog的事务总数. 基于业务表的binlog to ...
- Apache设置虚拟机端口
Apache虚拟机设置端口,以45184端口为例httpd-vhosts.conf文件NameVirtualHost *:45184<VirtualHost *:45184> Doc ...
- GDAL重投影重采样像元配准对齐
研究通常会涉及到多源数据,需要进行基于像元的运算,在此之前需要对数据进行地理配准.空间配准.重采样等操作.那么当不同来源,不同分辨率的数据重采样为同一空间分辨率之后,各个像元不一一对应,有偏移该怎么办 ...
- CF916A Jamie and Alarm Snooze 题解
Content 令一个时间为幸运时间,当且仅当该时间中包含数字 \(7\). 小 J 很懒,他决定在 \(h\) 时 \(m\) 分起床,于是他将闹钟设定在一个很幸运的时间,并通过按一次按钮以多睡 \ ...
- UVA294 约数 Divisors 题解
Content 给定 \(n\) 个区间 \([l,r]\),求出每个区间内约数个数最大的数. 数据范围:\(1\leqslant l<r\leqslant 10^{10}\),\(r-l\le ...
- Tornado 异步浅解
7.1 认识异步 1. 同步 我们用两个函数来模拟两个客户端请求,并依次进行处理: #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 202 ...