面向孩子们的 Python 入门指南(七)
二十二、将 Python 用于 Web 开发
在前一章中,我们学习了如何用 Pygame 创建一个太空射击游戏。我们学习了射击角色、碰撞检测、在 Pygame 屏幕上渲染文本等等。
在这一章中,我们来看看用 Python 进行 web 开发。让我们简单看看用 HTML、CSS 和 JavaScript 创建网站,以及用 Python 的 Flask 创建你的第一个程序。
Python 和 web 开发
什么是 web 开发?你访问网站吗?脸书、网飞、亚马逊等等?你在网上使用的任何东西都属于网络开发。
它们是用属于 web 开发的一套独特的技术来创建和维护的。这是如何工作的,Python 在这里起了什么作用?
好吧,在我们开始之前,让我们谈一点关于 web 开发的主要技术。有 HTML、CSS 和 JavaScript。
HTML 是网站的组成部分。这是什么意思?你在网上看到的一切都是由 HTML 创建的。图像、文本、按钮,一切都来自 HTML。
现在 CSS 设计了所有的样式。它被称为“级联样式表”,你用 HTML 创建的元素(构建块)可以被设计(颜色、对齐等。)使用 CSS。JavaScript 让一切都变得动态。当你点击网站上的一个按钮时,会发生一些事情,对吗?也许另一个网站打开了,或者你只是得到一个弹出窗口,给你一些信息。JavaScript 允许你在你的站点上做类似的事情。
但是 Python 呢?它在 web 开发中处于什么位置?要理解 Python 在 web 开发中的作用,需要理解前端和后端 web 开发的区别。
前端 web 开发就是我们刚才谈到的:HTML、CSS、JavaScript,所有这些加在一起我们得到了你的网站面向用户的一端;也就是用户看到的。
后端 web 开发正好相反。这是用户看不到的:服务器端开发。大多数应用需要大量的信息传输和检索,我说的对吗?您在某个网站上有一个帐户,当您登录到该网站时,应该会检索到您的帐户详细信息。你在谷歌上搜索一些东西,他们会给你一个与你的搜索相关的网站列表。
所有这些信息检索和传输(你向某人发送聊天消息或电子邮件)都属于后端 web 开发,你需要使用像 Python 这样的后端技术来实现这一点。Python 有一个“文件”特性,还记得吗?这只是开始。在 Python 的帮助下,您可以创建数据库并将它们连接到您的 web 应用等等。
让我们快速看一下这些技术能为我们提供什么。这不是一个全面的章节。Web 开发,尤其是全栈 web 开发,是一个巨大的主题,需要一本自己的书来完整地涵盖。我将给你们举一些例子来说明这些技术是如何工作的,以便让你们有所了解。如果你对这个主题感兴趣,你可以选择在将来阅读它。
构建模块–HTML
正如我之前告诉你的,HTML,即超文本标记语言,是用来创建你的网络应用的构建模块的。你可以在记事本(或 notepad++)中编写你的 HTML 代码,但是当你保存文件时,保存为 filename.txt 或 filename.txt,而不是 filename.txt
一个 HTML 代码有两部分,头部和身体。“头”包含用户不可见的代码,比如标题,而“体”包含页面所有可见的部分,比如段落、图像和按钮。
现在让我们创建一个简单的 HTML 文件。打开一个记事本,也许可以把你的文件命名为 website.html,或者任何你想命名的名字。当您将文件保存为 html 文件时,您会注意到图标从记事本图标变为默认浏览器图标。
<!DOCTYPE html>
<html>
</html>
前面的代码是 html 文件的框架。一个 HTML 代码包含标签,有的是空的,有的是有开始和结束标签的(就是这样写的:)。指定我们在代码中使用 HTML5,HTML 的最新版本。
<html>...</html>是根标签。它包含了整个代码。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>
这是你的头和身体标签。现在,让我们在标签中添加一个标题。
<!DOCTYPE html>
<html>
<head>
<title>My first website</title>
</head>
<body>
</body>
</html>
在浏览器中打开该文件,您将看到如图 22-1 所示的屏幕。
图 22-1
基本 HTML 网站
我们有我们的标题。完美!
如果要添加文本或元素,需要使用标签。让我快速列出一些重要的标签,这样我们就可以在我们的网站上使用它们。
<h1> </h1>用于创建主标题。
<h2> </h2>用于创建子标题。
您可以创建更多减小尺寸的标题(h3、h4、h5、h6),但常用的是 h1 和 h2。
<p> </p>用于创建段落。
<button> </button>用于创建按钮。
<a> </a>用于创建您在网上看到的超链接(链接到其他网站和页面)。
<img>用于创建图像。这是一个空标签,但是它需要属性来指定图像的位置。
所以,我想现在就够了。让我们在程序中使用它们。让我们为苏珊创建一个介绍页面。
<body>
<h1>My introduction</h1>
<p>Hello there! I'm Susan. I'm 8 years old. I have a puppy named Barky. I love him so much! :) </p>
<button>Click Me!</button>
<a href='google.com'>Look me up!</a>
<img src='susan.png'>
</body>
我们已经创建了一个标题、一个段落(如果你愿意,你可以创建更多)、一个按钮(还不能用,但已经创建好了)、一个到 Google 的链接(你可以链接到任何你想链接的地方),最后,我们显示了 Susan 的照片。
现在打开我们的网站,我们看到了这个(图 22-2 )。
图 22-2
添加到我们网站的各种元素
我们已经有了制作网页的材料!当然,按钮不起作用(等待 JavaScript),事情还不漂亮(CSS!),但是我们有我们的积木!
漂亮的东西——CSS
如果你想美化事物:添加颜色,对齐事物,等等,你需要 CSS。但是 CSS 是一个庞大的主题,所以我不会在这里面面俱到。让我给你们看一些例子。
要编写 CSS 样式,需要在标签中打开和关闭一个
调用您想要样式化的元素,并提及其中的样式属性和值,比如背景色:蓝色,就像这样。您需要用分号结束每个属性-值对,不像 Python 的代码行,缩进(或下一行)标志着一行代码的结束。
让我们将整个页面的背景颜色改为浅灰色。我们将为此调用 html 元素(整个页面)(图 22-3 )。
图 22-3
添加背景颜色
接下来,让我们将标题颜色更改为深绿色,将段落颜色更改为深红色。您需要使用“颜色”属性来实现这一点。
<head>
<title>My first website</title>
<style>
html {
background-color: lightgray;
}
h1 {
color: darkgreen;
}
p {
color: darkred;
}
</style>
</head>
刷新你的网页,你会看到这个(图 22-4 )。
图 22-4
用 CSS 定制(设计)你的网站
这就是基本的 CSS。正如我所说的,这是一个很大的话题,所以我不能在这里完全涵盖它。
前端动态–JavaScript
让我们试着在这一部分让我们的按钮动态化。JavaScript 是一种脚本语言,就像 Python 一样。唯一的区别是前端用 JavaScript,后端用 Python。
您可以使用<script></script>标签来编写您的 JavaScript 代码,通常在标签内,这样整个网站在动态特性加载之前就加载了。
<body>
<h1>My introduction</h1>
<p>Hello there! I'm Susan. I'm 8 years old. I have a puppy named Barky. I love him so much! :) </p>
<button>Click Me!</button>
<a href='google.com'>Look me up!</a>
<img src='susan.png'>
<script>
</script>
</body>
JavaScript 包含变量、数字、字符串、布尔值、if else 语句、for 和 while 循环、对象以及我们刚刚在 Python 中介绍过的许多其他概念。但这两种语言之间存在差异,尤其是在语法以及如何编写或使用这些语言方面。我们不会在这里一一列举,但我们只列举几个。
您可以使用关键字“let”创建变量。
let variableName;
就像 CSS 一样,JavaScript 中的每一行代码都需要以分号结束。
您也可以给这些变量赋值。但是让我们不要看世俗的东西。让我们看看 JavaScript 的真正力量,它操纵你的 HTML 元素(改变它们的样式,让它们做事情,等等。)就在您的 JavaScript 代码中。
为此,让我首先为我的元素分配一个惟一的“id ”,如下所示:
<button id="btn">Click Me!</button>
这是唯一的 id,不能分配给任何其他元素。我可以使用这个 id 来设置这个特定元素的样式,或者使用 JavaScript 来检索它,如下所示:
<script>
let button = document.getElementById('btn');
</script>
我已经创建了一个变量“button ”,并从我的文档(HTML 文档)中检索了 id 为“btn”的元素,并将它放入变量中。JavaScript 是区分大小写的,所以大写字母也应该保留。
现在,我可以监听这个元素中的事件。我们要不要听一个“咔嚓”事件?我们要不要在你点击按钮的时候弹出一个警告框(就像t inter里的消息框一样)?
您需要在刚刚检索的元素上添加一个事件侦听器。这个侦听器将侦听“click”事件,并在事件发生时调用 buttonClick()函数。
<script>
let button = document.getElementById('btn');
button.addEventListener('click',buttonClick);
</script>
现在,定义调用上面的函数。在 JavaScript 中,我们不用“def”,我们用“function”来定义一个函数。要创建一个提醒,使用类似这样的东西:alert('你的消息');
<script>
let button = document.getElementById('btn');
function buttonClick() {
alert("Hello there! I'm Susan!");
}
button.addEventListener('click',buttonClick);
</script>
现在,让我们刷新页面,看看我们的按钮是否工作(图 22-5 )。
图 22-5
用 JavaScript 制作网站
看那个!我点击了我的按钮,弹出了一个警告框,信息是“你好!我是苏珊!”。很完美,不是吗?这就是 JavaScript 的力量。
Python 的Flask
要用 Python 创建后端,最好使用框架。我们已经看过 Python 的包和库,比如 Turtle 、 Tkinter 和 Pygame 。我们知道它们有多有用,以及它们在多大程度上增强了原始 Python 代码。这同样适用于 web 框架。
最著名的是 Django 和 Flask 。在结束本章之前,让我们看一个关于烧瓶的简单例子。你不能这样使用烧瓶。你需要安装它。
要安装它,请打开命令提示符,并键入以下内容:
pip install Flask
按回车键并等待一段时间。您应该会得到这样的成功消息(图 22-6 )。
图 22-6
安装闪存
现在,让我们创建一个简单的程序,在屏幕上显示我们的介绍性消息。打开一个脚本并命名。让我们将我们的命名为 hello.py。首先从我们的“Flask”框架导入 Flask 类。
from flask import Flask
然后,让我们在变量“app”中创建该类的一个实例。
app = Flask(__name__)
现在,我们需要创建一条路线。我们希望我们的页面出现在网站的“根”上,你知道当你键入 http://websitename.com 或类似的东西时,所以我的路径将是“/”。你可以做你的'/介绍什么的。
@app.route('/')
现在,创建一个函数,introduction,并返回你想在屏幕上显示的内容。不需要调用这个函数。
def introduction():
return "Hello, there! I'm Susan! I'm 8 years old. I have a puppy named Barky. I love him so much! :)"
最后,让我们为我们的网站设置一个主机和端口。这就是 web 开发人员在将他们的网站部署到网上(有实际网站名称的互联网)之前,如何在本地(没有互联网)测试他们的网站。常用的主机是 0.0.0.0,端口是 5000。
app.run(host='0.0.0.0', port=5000)
我们完了!让我们运行我们的程序。
该文件应保存在命令提示符打开所在的文件夹中。我的是 C:\Users\aarthi,所以我要把 hello.py 保存在那里。
现在,转到您的命令提示符并在 Shell 提示符中键入 python hello.py,然后按 Enter 键,您将得到这个(图 22-7 )。
图 22-7
运行您的烧瓶代码
现在,你可以点击这个链接看到你的网站:http://127.0.0.1:5000/(图 22-8 )。
图 22-8
你的烧瓶网站
耶!我们的第一个烧瓶程序。
摘要
在这一章中,我们看了用 Python 进行 web 开发。我们简单看了一下用 HTML、CSS 和 JavaScript 创建网站,以及用 Python 的 Flask 创建你的第一个程序。在下一章,让我们用你在本书中学到的 Python 概念创建更多的迷你项目。
二十三、更多迷你项目
在前一章中,我们学习了使用 Python 进行 web 开发。我们简要了解了 HTML、CSS 和 JavaScript,并用 Flask 创建了您的第一个程序。在这一章中,让我们用你在这本书中学到的 Python 概念创建更多的迷你项目。
项目 23-1:带t inter的计算器
在这个项目中,我们将创建一个计算器应用,就像你在电脑和手机上看到的带有 Tkinter 的那个。我们开始吧!
-
让我们先导入 Tkinter 并创建我们的窗口。我将把 resizable 选项设置为 0 和 0,这样窗口就不能调整大小了。我还打算把标题设为‘计算器’。
-
现在,我将创建一个字符串变量( Tkinter 变量)来保存我们的表达式(需要计算)。我还创建了一个空字符串,最初用来存放表达式。我们稍后将使用“字符串”中的值设置 Tkinter 变量。现在,我们让它成为一个字符串,而不是整数或浮点数,因为我们可以使用 Python 中的 eval()方法来计算数学表达式,表达式可以是字符串的形式。
from tkinter import *
w = Tk()
w.resizable(0,0) #cant resize
w.title('Calculator')
- 现在,让我们创建我们的按钮。
e = StringVar()
calc = ''
首先,我将创建一个“进入”按钮。它将保存“e”,我们的 Tkinter 变量,让我们将文本对齐到“右”,并在顶部填充足够的外部填充(padx,pady)和内部填充高度(ipady)。
- 接下来,让我们创建一个框架,“按钮”,这将举行我们所有的按钮。我们也打包吧。
entry = Entry(w,font=('Arial',14,'bold'),textvariable = e, justify= RIGHT)
entry.pack(side=TOP, ipady = 7, padx = 5, pady = 5)
- 现在,让我们开始创建所有的按钮。它们的宽度为 13,高度为 2,我们将为 clear 按钮调用 clear_entry()方法,当单击“答案”或“等于”按钮时调用 get_answer()方法,或者调用 button_click()方法,将数字或运算符添加到表达式中。
buttons = Frame(w)
buttons.pack()
-
Now that we’ve created our buttons, we should have something like Figure 23-1.
图 23-1
计算器应用–布局
-
现在,让我们在函数调用(小部件)上方创建按钮。首先,button_click 方法。让我们加载我们的全局“calc”变量,并将所点击的数字或操作符(记住,我们是以字符串的形式发送的)与“calc”的当前值连接起来。就这样!
clear = Button(buttons,text='c',width=13,height=2,font=('Arial',10,'bold'), command=lambda:clear_entry())
clear.grid(row=0,column=0,padx=5,pady=5,columnspan=2)
answer = Button(buttons,text='=',width=13,height=2,font=('Arial',10,'bold'), command=lambda:get_answer())
answer.grid(row=0,column=2,padx=5,pady=5,columnspan=2)
num7 = Button(buttons,text='7', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('7'))
num7.grid(row=1,column=0,padx=5,pady=5)
num8 = Button(buttons,text='8', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('8'))
num8.grid(row=1,column=1,padx=5,pady=5)
num9 = Button(buttons,text='9', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('9'))
num9.grid(row=1,column=2,padx=5,pady=5)
num_div = Button(buttons,text='/', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('/'))
num_div.grid(row=1,column=3,padx=5,pady=5)
num4 = Button(buttons,text='4', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('4'))
num4.grid(row=2,column=0,padx=5,pady=5)
num5 = Button(buttons,text='5', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('5'))
num5.grid(row=2,column=1,padx=5,pady=5)
num6 = Button(buttons,text='6', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('6'))
num6.grid(row=2,column=2,padx=5,pady=5)
num_mul = Button(buttons,text='*', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('*'))
num_mul.grid(row=2,column=3,padx=5,pady=5)
num1 = Button(buttons,text='1', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('1'))
num1.grid(row=3,column=0,padx=5,pady=5)
num2 = Button(buttons,text='2', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('2'))
num2.grid(row=3,column=1,padx=5,pady=5)
num3 = Button(buttons,text='3', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('3'))
num3.grid(row=3,column=2,padx=5,pady=5)
num_sub = Button(buttons,text='-', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('-'))
num_sub.grid(row=3,column=3,padx=5,pady=5)
num0 = Button(buttons,text='0', width = 13, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('0'))
num0.grid(row=4,column=0,padx=5,pady=5,columnspan=2)
num_dot = Button(buttons,text='.', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('.'))
num_dot.grid(row=4,column=2,padx=5,pady=5)
num_add = Button(buttons,text='+', width=5, height = 2, font=('Arial',10,'bold'), command=lambda:button_click('+'))
num_add.grid(row=4,column=3,padx=5,pady=5)
- 最后,用 calc 的当前值设置 Tkinter 变量。这将使表达式出现在应用的输入框中。
def button_click(n):
global calc
calc = calc + n
- 接下来,对于 clear_entry 方法,我们将再次使“calc”成为空字符串,并将“e”设置为该字符串。
e.set(calc)
- 对于 get_answer 方法,让我们导入“calc ”,创建一个变量“ans ”,该变量将使用 eval()方法计算“calc”中的表达式,并将答案设置为“e ”,因此表达式将替换为答案。
def clear_entry():
global calc
calc = ''
e.set(calc)
- 最后,让我们将“ans”转换为一个字符串(计算后它将是一个整数或浮点值),并用答案替换“calc”中的表达式,这样我们就可以继续计算。
def get_answer():
global calc
ans = eval(calc)
e.set(ans)
calc = str(ans)
运行程序,你会得到这个(图 23-2 )。
图 23-2
最终计算器应用
就这样!一个非常简单的计算器。事实上,你可以做很多事情来改善这种情况。也许添加一些颜色,解决一些问题,或者添加更多的功能。例如,到现在为止,你可以一个接一个地点击两个操作符,这会给你一个错误。你为什么不创造一个“如果”条件来防止这种情况发生呢?
玩得开心!
项目 23-2:随机故事生成器
在这个项目中,让我们创建一个简单的随机故事生成器。我们将有一堆选项,关于我们的故事“何时”发生,我们的“角色”是谁,我们的“敌人”是谁,我们角色的“属性”是什么,以及代词(他或她或它)。最后,我们要写一个从这些选项中选择的故事,每次我们创建一个新的故事,我们都会得到全新的角色、事件和时间线。够有趣吗?我们开始吧!
-
让我们先导入我们的随机模块。
-
然后,我将创建我的选项。
when_ch = ['Once upon a time,','A long time ago,','Thousands of years ago,','Long long ago,'] character_ch = ['dragon','unicorn','fairy','elf'] pronouns_ch = ['he','she','it'] attributes_ch = ['brave','courageous','strong','smart','intelligent'] enemy_ch = ['witches','warlocks','dark elves'] saved_ch = ['the world', 'the Kingdom', 'everyone', 'the village'] -
最后,让我们定义一个 generate_story()函数,它加载我们在。然后,让我们使用 random 模块中的 choice()方法为这个特定的故事选择我们的选项。
def generate_story(): global when_ch,character_ch,pronouns_ch,attributes_ch,enem_chy,saved_ch when = random.choice(when_ch) character = random.choice(character_ch) pronouns = random.choice(pronouns_ch) attributes = random.choice(attributes_ch) enemy = random.choice(enemy_ch) saved = random.choice(saved_ch) -
此外,如果我们的角色是一个精灵,我们需要用“an”和“a”来称呼其余的角色。
if character == 'elf': a = 'an' else: a = 'a' -
最后,让我们用多弦创造我们的故事。
story = '''{} there lived {} {}. {} was very {}. {} fought against the {} and saved {}'. '''.format(when,a,character,pronouns.capitalize(),attributes,pronouns.capitalize(),enemy,saved) -
现在,让我们把它打印出来。
import random
-
现在,对于函数调用,我将创建一个无限 while 循环,询问用户是否要创建一个新的故事。如果他们输入了“Y”或“Y ”,那么让我们调用 generate_story 函数。否则,让我们停止程序。
while True: create = input('Shall we create a new story? Y or N: ') if create == 'Y' or create == 'y': generate_story() else: break
print(story)
很简单,对吧?为什么我们现在不生成一堆故事呢?
= RESTART: C:\Users\aarthi\AppData\Local\Programs\Python\Python38-32\story_generator.py
Shall we create a new story? Y or N: Y
Thousands of years ago, there lived a unicorn. She was very strong. She fought against the dark elves and saved the world'.
Shall we create a new story? Y or N: Y
Thousands of years ago, there lived a dragon. She was very intelligent. She fought against the witches and saved the world'.
Shall we create a new story? Y or N: Y
Once upon a time, there lived an elf. It was very smart. It fought against the dark elves and saved the Kingdom'.
Shall we create a new story? Y or N: N
很好!虽然很简单。我相信你可以添加更多的选项,让这些故事更大或更随机。玩得开心!
项目 23-3:石头剪刀布游戏
让我们为这个项目创建一个石头剪子布游戏!
-
让我们先导入 Tkinter 和随机包。
#Rock, paper, scissors from tkinter import * import random -
现在,让我们创建我们的窗口,将其背景颜色配置为白色,并使其不可调整大小。
w = Tk() w.configure(bg='white') w.resizable(0,0) -
首先,我们需要一个包含标题的标签。
title = Label(w,text='Rock Paper Scissors', fg="red", bg="white",font=('Arial',45,'bold')) title.pack() -
让我们也创建一个 u_option 变量,它现在是空的,但是以后会保存用户的选项。
-
让我们用这三个选项创建一个列表。
u_option = ''
-
现在,让我们创建其余的小部件。我们需要另一个标签,上面写着“选择一个”。
label = Label(w,text='Choose one', fg="green", bg="white",font=('Arial',25,'bold')) label.pack() -
在那下面,我们需要一块画布来放置石头、纸和剪刀。让我们这样做,当用户悬停在画布上时,光标变成一只“手”。
canvas = Canvas(w,width=500,height=150,background='white') canvas.pack() canvas.config(cursor='hand2') -
接下来,让我们使用 PhotoImage 方法加载我们的图像。你可以使用任何你想要的图像。我用了石头、纸和剪刀的插图。
options = ['rock','paper','scissors']
- 接下来,让我们将图像绘制到画布中,在我们想要的 X,Y 坐标位置。
img1 = PhotoImage(file="rock.png")
- 然后,让我们在该图像上创建一个 tag_bind。对于画布项目,我们需要 tag_bind,而不是 bind。我们的将是一个绑定,用于鼠标左键点击,让我们调用 chose()方法,参数是刚刚被点击的项目。
rock = canvas.create_image(50,20,anchor=NW,image=img1)
我们将在这里使用 lambda,因为绑定需要在它们的函数定义中包含事件,而 lambda 本质上是一个函数定义,所以在这里包含“event”作为 lambda 的属性。
- 就这样!让我们为接下来的两张图片重复这个过程。
canvas.tag_bind(rock,'<Button-1>',lambda event:chose('rock'))
-
现在,让我们创建最初为空的标签,但稍后将保存我们想要的信息,关于用户的选择、计算机的选择和获胜者。
you_chose = Label(w,text='', fg="blue", bg="white",font=('Arial',25,'bold')) you_chose.pack() c_chose = Label(w,text='', fg="blue" , bg="white",font=('Arial',25,'bold')) c_chose.pack() winner = Label(w,text='', fg="brown", bg="white",font=('Arial',45,'bold')) winner.pack() -
现在,让我们在小部件上创建 chose()函数。让我们导入 u_option 变量。
def chose(option): global u_option -
如果 u_option 为空,这意味着用户第一次选择一个选项,我们准备好开始游戏了。我们把期权赋给 u_option。
if u_option == '': u_option = option -
让我们也为我们的计算机选择一个随机选项,并把它放在 c_option 中。
img2 = PhotoImage(file='paper.png')
paper = canvas.create_image(200,20,anchor=NW,image=img2,)
canvas.tag_bind(paper,'<Button-1>',lambda event:chose('paper'))
img3 = PhotoImage(file='scissors.png')
scissors = canvas.create_image(350,20,anchor=NW,image=img3)
canvas.tag_bind(scissors,'<Button-1>',lambda event:chose('scissors'))
-
现在,让我们用我们的选择来配置 you _ chose 和 c _ chose。
you_chose.config(text='You chose {}'.format(u_option)) c_chose.config(text='Computer chose {}'.format(c_option)) -
接下来,我们来看看谁赢了。如果 u_option 和 c_option 的值相同,那就是平局。如果 u_option 是石头,那么 c_option 是剪刀用户赢,c_option 是纸用户输。同样,让我们创建其他条件,并为每个结果配置“winner”。
if u_option == c_option: winner.config(text='Draw!') elif u_option == 'rock': if c_option == 'paper': winner.config(text='You lose :(') elif c_option == 'scissors': winner.config(text='You win!') elif u_option == 'paper': if c_option == 'rock': winner.config(text='You win!') elif c_option == 'scissors': winner.config(text='You lose :(') elif u_option == 'scissors': if c_option == 'paper': winner.config(text='You win!') elif c_option == 'rock': winner.config(text='You lose :(') -
最后,让我们创建我们的“新游戏”按钮。
new = Button(w,text='New Game',font=('Arial',20,'bold'),command=new_game) new.pack() -
在按钮上方,定义 new_game()函数。我们先加载 u_option。现在,让我们配置我们的标签,让它们再次变成空的,让我们清空 u_option,让用户可以再次播放。
def new_game(): global u_option you_chose.config(text='') c_chose.config(text='') winner.config(text='') u_option = '' -
就这样!让我们用一个主循环来结束程序。
c_option = random.choice(options)
w.mainloop()
现在,让我们运行程序(图 23-3 )。
图 23-3
石头剪刀布游戏
当用户点击一个选项时,他们会看到这个(图 23-4 )。
图 23-4
用户选择了一个选项
完美运作!
项目 23-4:用Pygame弹跳球(从四面墙上)
在这个项目中,我们将创建一个从屏幕的四面墙上随机反弹的弹力球。当它碰到屏幕的四面墙中的任何一面时,它应该反转方向并像那样继续。够简单吗?让我们用 pygame 来做这件事。
-
我们先导入 pygame,random 和 time。
import pygame import random import time -
然后,让我们初始化 pygame 并创建我们的屏幕。它的宽度和高度都是 500。
pygame.init() screen = pygame.display.set_mode((500,500)) -
现在,让我们创建一个变量 x 并把它设为 250,一个变量 y 并把它设为 0。这是因为我们想从点 250,0 开始反弹。
x = 250 y = 0 -
我们还需要一个“游戏”变量,该变量当前为真,但当用户关闭屏幕时将变为假。
-
让我们也创建 x 和 y 方向变量“xd”和“yd ”,它们默认为 1。我们将在范围(1 到 2)(向上移动)和范围(–1 到–2)(向下移动)内增加球的 x 或 y 值。这个变量会改变球的方向。
xd = 1 yd = 1 -
现在,让我们创建我们的游戏循环。
game = True
-
首先,让我们创建退出条件。如果事件类型是 pygame。退出,让游戏变得虚假。
for event in pygame.event.get(): if event.type == pygame.QUIT: game = False -
然后,让我们用白色填充我们的屏幕。
while game:
-
然后,我们用 draw.circle 方法在位置 250,y(一开始是,250,0)画一个红球。它的半径是 25,是一个完全填充的圆,所以最后一个属性是 0。
#draw a ball #circle draw function #where you want to draw it, color of the circle, position, width pygame.draw.circle(screen,(0,0,255),(250,y),25,0) -
让我们使用 display.update 方法来确保每次循环运行时屏幕都得到更新。
pygame.display.update() #update the screen in the output window -
如果我们让游戏保持原样,我们的球会移动得太快以至于人眼看不到。所以,让我们放慢循环的迭代速度。每次迭代后会有 0.005 秒的延迟。
screen.fill((255,255,255))
-
现在,让我们设置墙壁碰撞条件。当 x 大于或等于 488 时(因为我们的球的直径为 25,我们需要球的另一半可见,所以我们将其设置为 488 而不是 500),让我们将 x 的值减少 1 到 2 之间的随机值,因为我们需要球向左移动(回到屏幕内部)。所以 xd 是-1。
if x >= 488: xd = -(random.randint(1,2)) -
如果 y > = 488,同样,减小 yd 的值。
elif y >= 488: yd = -(random.randint(1,2)) -
如果 x < = 12,则增加 xd,如果 y 小于或等于 12,则增加 yd。
elif x <= 12: xd = (random.randint(1,2)) elif y <= 12: yd = (random.randint(1,2)) -
最后,一旦我们脱离了 if elif 语句,让我们用“y”的当前值加上“d”。
x += xd y += yd pygame.quit()
time.sleep(0.005)
就这样!运行这个程序(图 23-5 ),你会得到一个从屏幕的四面墙上反弹回来的弹力球。耶!
图 23-5
弹跳球(离开四面墙)
项目 23-5:温度转换应用
对于这个项目,让我们创建一个温度转换应用。我们的应用将有两个功能,一个“摄氏到华氏”转换器和一个“华氏到摄氏”转换器。
-
让我们导入 tkinter 并设置我们的屏幕。
from tkinter import * w = Tk() -
现在,让我们设计我们的应用。这将是一个非常简单的设计。我们将创建两个框架,每个转换器一个。
frame1 = Frame(w) frame1.grid(row=0,column=0,padx=10,pady=10) -
让我们创建一个标签、一个摄氏温度值的输入框、一个点击时进行转换的按钮和另一个获得结果(华氏温度值)的输入框。
#Celsius to Fahrenheit conversion label1 = Label(frame1,text='Celsius to Fahrenheit conversion',font=('Arial',15,'bold')) label1.grid(row=0,column=0,columnspan=3) entry1 = Entry(frame1) entry1.grid(row=1,column=0) button1 = Button(frame1, text='Convert to Fahrenheit',command=find_fahrenheit) button1.grid(row=1,column=1) entry2 = Entry(frame1) entry2.grid(row=1,column=2) -
让我们对下一个转换器重复同样的操作。
frame2 = Frame(w) frame2.grid(row=1,column=0,padx=10,pady=10) #Fahrenheit to Celsius conversion label2 = Label(frame2,text='Fahrenheit to Celsius conversion',font=('Arial',15,'bold')) label2.grid(row=0,column=0,columnspan=3) entry3 = Entry(frame2) entry3.grid(row=1,column=0) button2 = Button(frame2, text='Convert to Celsius',command=find_celsius) button2.grid(row=1,column=1) entry4 = Entry(frame2) entry4.grid(row=1,column=2) -
Run the program, and you’ll get this (Figure 23-6).
图 23-6
温度转换器
-
现在,让我们在小部件上创建我们的函数。find_fahrenheit()函数将摄氏温度转换为华氏温度。
-
有一个公式可以做到这一点,如下所示:
def find_fahrenheit():
- 让我们删除第二个输入框(结果框),以防用户已经进行了转换,并且这是一个新的转换。
#Formula is F = ((9/5)*C)+32
-
现在,让我们获取第一个输入框在“C”中的值,并将其转换为一个整数。
C = entry1.get() C = int(C) -
现在,让我们计算“F ”,并将其插入第二个输入框。就这样!
F = ((9/5)*C)+32 entry2.insert(0,F) -
让我们对 find_celsius 函数重复同样的操作。
def find_celsius(): #Formula is C = (5/9)*(F-32) entry4.delete(0,END) F = entry3.get() F = int(F) C = (5/9)*(F-32) entry4.insert(0,C)
entry2.delete(0,END)
让我们运行我们的程序,我们会得到这个(图 23-7 )。
图 23-7
转换
有效!
项目 23-6:用文件和Tkinter介绍
这将是一个简单的项目。我们将在您选择的文件夹中创建一个名为 introduction.txt 的文本文件。我们将通过 Python 代码编写对该文件的介绍,最后,我们将创建一个简单的文本应用,它接受文件名(完整的文件路径)并在文本框中打印出该文件的内容。
我们可以开始了吗?
-
在我们开始之前,让我们导入 Tkinter 并创建我们的屏幕。
from tkinter import * w = Tk() -
我将在下面的路径中创建我的文件:
G:\\Python\introduction.txt -
我也可以用“x ”,但是我用的是“w ”,这样我就不用再以写模式打开文件了。
-
4.然后,我要写苏珊对它的介绍:
f.write('''Hi, I'm Susan. I'm 9 years old. My puppy's name is Barky. He loves me very very much! :)''') -
现在,我将创建一个全局变量,每当我在输入框中按 Enter 键时,它将存储文件的内容。现在让我们在其中存储一个空字符串。
f = open('G:\\Python\introduction.txt','w')
-
现在,让我们创建我们的小部件。我想要一个在我的输入框左边的标签。因此我把它放在第 0 行第 0 列。
label = Label(w,text='File name',font=('Arial',12,'bold')) label.grid(row=0,column=0,padx = 5, pady=5) -
我将把我的输入框放在第 0 行第 1 列,让它在四个方向都有粘性,并给所有东西填充。我选择的所有值(宽度、填充等。)都是任意的。你可以测试不同的值,选择你喜欢的。
entry = Entry(w,width=65) entry.grid(row=0,column=1,sticky='nsew', padx = 5, pady=5) -
最后,让我们为我的条目创建一个绑定。每当我按下键盘上的 Enter 键(Mac 中的命令)时,我都想调用我的 get_file 函数。您需要使用''条件来实现这一点。
f_content = ''
-
最后,让我们创建文本小部件。我将为我的文本设置一些默认样式,并将其放在第 1 行第 0 列,使其跨越两列(因此它占据了前两个小部件的整个宽度)。
text = Text(w,font=('Arial',14,'bold')) text.grid(row=1,column=0,columnspan=2) -
好了,现在我们完成了小部件,让我们定义 get_file 函数。定义在调用函数上面好吗?
entry.bind('<Return>',get_file)
因为我们创建了一个绑定,所以我们的函数需要接收“事件”。将 f_content 加载到函数中。
-
首先,从输入框中获取文件名。然后,以读取模式打开该文件,并将其内容存储在 f_content (f.read())中。
file = entry.get() f = open(file,'r') f_content = f.read() -
最后,将 f_content 中的内容插入到文本框中。我们使用“end”来插入全部内容。
def get_file(event):
global f_content
text.insert('end',f_content)
就这样!
现在让我们运行我们的程序(图 23-8 )。
图 23-8
Tkinter app 布局
我们的小部件就在我们想要的地方!让我们看看我们的程序现在是否工作(图 23-9 )。
图 23-9
导入文件内容
是的,确实如此。我输入了我的文件路径(确切的路径)并按下 Enter 键,我的文件内容显示在我的文本框中。完美!
摘要
在这一章中,我们使用 Tkinter 或 Pygame 创建了六个应用。我们创建了一个计算器,一个随机故事生成器,一个石头剪刀布游戏,一个文件上传应用,一个温度转换应用和一个弹力球。
在下一章,我们来谈谈你的 Python 之旅的下一步。我会给你一些关于你接下来需要学习的东西的想法,我也会给你一些关于你可以自己工作的更多迷你和顶点项目的想法。
二十四、下一步是什么?
在前一章中,我们用 Python 创建了更多有趣的迷你项目。在这一章中,让我们看看接下来会发生什么。我将为您提供更多的 mini 和 capstone 项目想法供您尝试,并且让我们简单地讨论一下如何从这里继续您的 Python 之旅。
迷你项目的想法你可以试试
Python 是一种非常有趣的编程语言,你可以做任何你想做的事情。
迷你项目和拼图是积累 Python 专业知识的好方法。在这本书里,你已经创建了很多迷你项目。为什么我不给你一些想法来创建你自己的迷你项目呢?
货币兑换应用
你可以用这个项目。尝试为尽可能多的货币创建转换选项。
你可以把它做成一个单行的应用,在文本框旁边有下拉菜单(就像你在谷歌的货币转换应用中看到的那样)。下拉列表将列出所有货币选项。根据两边的选择,进行转换。
简单吧?尽可能自动化,也就是尽可能减少代码行。
参加 Pygame 的比赛
我们在一个迷你项目中创建了一个海龟比赛,记得吗?你为什么不用的 Pygame 做同样的尝试,但是这次要做得更好?用线创建适当的跑道,并将您的有色玩家(可以是矩形)放在跑道的起点。
也许你也可以创建一个开始按钮,点击它,让你的玩家比赛(让他们随机移动),最后,根据谁赢了,创建一个玩家颜色的“游戏结束”屏幕。
很简单,不是吗?试试看!
更多图案在turtle
你记得我们在早期项目中创造的曼荼罗模式吗?你为什么不试着创造更多这样的图案呢?让它们变得更复杂。您已经知道可以使用 for 循环来自动化模式。
您可以创建不同的图案(圆形和方形)并将它们随机组合在一起(使用函数调用)。
顶石项目的想法你可以试试
我们已经看到了如何在turtle中创建贪食蛇游戏,但是正如你现在看到的, Pygame 更适合任何游戏,那么你为什么不尝试在 Pygame 中创建同样的游戏呢?
Pygame 中的贪食蛇游戏
创建它应该很简单。为蛇头和身体部位(包括苹果)绘制矩形,让它们移动(你已经知道如何移动),当蛇头叠加苹果时创建一个记分牌,同时让蛇增长一个身体部位,最后如果有碰撞(墙壁或身体碰撞)就结束游戏。
躲避子弹
为什么我们不用 Pygame 创建一个反向的太空游戏呢?不是向外星人开枪,而是一群外星人向你开枪。你没有弹药了,你现在唯一能做的就是躲开雨点般的子弹(从每艘外星飞船上随机发射,这样你就不知道哪艘要射向你),而这正是你要做的。
比方说,你有十条命,每次子弹击中你,你就失去一条命。坚持的时间越多,分数越高。很有趣,但很简单,你不觉得吗?让游戏变得如你所愿的简单或困难。
记忆游戏 Pygame
这是一个有趣的小游戏,你可能在街机上玩过。创建偶数编号的框。每个盒子后面都藏着一幅图像,但有一个问题。每个图像有两个,你需要匹配它们。
当用户开始游戏时,在指定的时间限制内(可能是 5-10 秒)显示隐藏在盒子后面的所有图像,这样用户就可以看到它们在哪里。然后,再藏起来,游戏就开始了。现在,用户需要匹配图像。
用户第一次点击其中一个框时,它后面的图像就会显示出来。他们必须在下一次点击有相同图像的盒子。如果他们不这样做,如果下一个被显示的图像是不同的图像,这两个图像将再次被隐藏,他们可以重新开始。
如果他们一个接一个地点击隐藏相同图像的相同方框,那么这些方框将不会再被隐藏,他们就获得一分。
他们需要在给定的时间限制内匹配所有像这样的盒子(通常一组 10 张图像需要 30 秒)。
有趣吗?试试看!
展望未来
好了,我们到了书的末尾。到目前为止,您已经学习了 Python 的基础知识,所有关于 Turtle 、 Tkinter 和 Pygame 的知识,并且您还创建了项目来熟悉这些主题。下一步是什么?你应该如何继续你的旅程?让我给你一些建议。
详细的哎呀
我们确实学习了对象和类,但是我们没有更深入地研究这个主题,一点也没有。如果你想做真正的编程,OOPs 会给你很大的帮助。对于任何编程语言来说,这也是一项宝贵的技能,更不用说 Python 了。
那么,为什么不从在更多的项目中使用类开始,看看它们是如何转换代码的呢?接下来,拿起一本好的 Python 面向对象编程的书,继续你的旅程。
正则表达式
在任何编程语言中,正则表达式都是一个非常有趣的高级话题,尤其是 Python。这基本上是一个扭曲的模式匹配。
您是否想知道程序如何知道您的密码没有指定数量的字母、数字和特殊字符,以及它们如何能够指出其中一个字符是否是大写字母?魔法?不,这是你的正则表达式模式匹配。
课题研究。我肯定你会发现它很有趣。
Web 开发
我已经向您介绍了 web 开发的基本知识,但是您可能已经猜到了,我们仅仅触及了皮毛。还有很多东西要学,还有很多事情要做。
就 web 开发而言,世界是你的。深入研究 HTML、CSS 和 JavaScript,了解更多关于网站设计和开发的知识。然后,使用 Django 或 Flask 作为后端,使用 MongoDB 为程序创建和维护数据库。一旦你学会了这个主题,试着创建项目(也许是一个社交媒体网站或一辆购物车)。这是一个需要几个月才能学会的庞大话题。一步一步来。
详细包装
是的,我们已经在一定程度上看过turtle、 Tkinter 和 Pygame 。但是还有很多要学的。因此,我建议创建更多的项目(不仅仅是本书中提到的那些),当你遇到更多的问题时,你会寻找更多的解决方案(或语法)来解决它们,你会更深入地研究你正在处理的每个包。
玩得开心!
摘要
在这一章中,我给了你更多关于迷你和顶点项目的想法,你可以尝试自己创造。然后,我给了你接下来可以学习的方向。
就这样!我们已经到了这本书的结尾。我希望你和我一起学习 Python 很开心。不要停止学习和创造,但更重要的是,永远不要停止享受乐趣!