面向孩子们的-Python-入门指南-七-

104 阅读33分钟

面向孩子们的 Python 入门指南(七)

原文:Introduction to Python for Kids

协议:CC BY-NC-SA 4.0

二十二、将 Python 用于 Web 开发

在前一章中,我们学习了如何用 Pygame 创建一个太空射击游戏。我们学习了射击角色、碰撞检测、在 Pygame 屏幕上渲染文本等等。

在这一章中,我们来看看用 Python 进行 web 开发。让我们简单看看用 HTML、CSS 和 JavaScript 创建网站,以及用 Python 的 Flask 创建你的第一个程序。

Python 和 web 开发

img/505805_1_En_22_Figa_HTML.jpg

什么是 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 所示的屏幕。

img/505805_1_En_22_Fig1_HTML.jpg

图 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 )。

img/505805_1_En_22_Fig2_HTML.jpg

图 22-2

添加到我们网站的各种元素

我们已经有了制作网页的材料!当然,按钮不起作用(等待 JavaScript),事情还不漂亮(CSS!),但是我们有我们的积木!img/505805_1_En_22_Figb_HTML.gif

漂亮的东西——CSS

如果你想美化事物:添加颜色,对齐事物,等等,你需要 CSS。但是 CSS 是一个庞大的主题,所以我不会在这里面面俱到。让我给你们看一些例子。

要编写 CSS 样式,需要在标签中打开和关闭一个

调用您想要样式化的元素,并提及其中的样式属性和值,比如背景色:蓝色,就像这样。您需要用分号结束每个属性-值对,不像 Python 的代码行,缩进(或下一行)标志着一行代码的结束。

让我们将整个页面的背景颜色改为浅灰色。我们将为此调用 html 元素(整个页面)(图 22-3 )。

img/505805_1_En_22_Fig3_HTML.jpg

图 22-3

添加背景颜色

接下来,让我们将标题颜色更改为深绿色,将段落颜色更改为深红色。您需要使用“颜色”属性来实现这一点。

<head>
      <title>My first website</title>
      <style>
            html {
                    background-color: lightgray;
                 }

            h1 {
                    color: darkgreen;
               }

            p {
                    color: darkred;
              }
      </style>
</head>

刷新你的网页,你会看到这个(图 22-4 )。

img/505805_1_En_22_Fig4_HTML.jpg

图 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 )。

img/505805_1_En_22_Fig5_HTML.jpg

图 22-5

用 JavaScript 制作网站

看那个!我点击了我的按钮,弹出了一个警告框,信息是“你好!我是苏珊!”。很完美,不是吗?这就是 JavaScript 的力量。

Python 的Flask

要用 Python 创建后端,最好使用框架。我们已经看过 Python 的包和库,比如 TurtleTkinterPygame 。我们知道它们有多有用,以及它们在多大程度上增强了原始 Python 代码。这同样适用于 web 框架。

最著名的是 Django 和 Flask 。在结束本章之前,让我们看一个关于烧瓶的简单例子。你不能这样使用烧瓶。你需要安装它。

要安装它,请打开命令提示符,并键入以下内容:

pip install Flask

按回车键并等待一段时间。您应该会得到这样的成功消息(图 22-6 )。

img/505805_1_En_22_Fig6_HTML.jpg

图 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 )。

img/505805_1_En_22_Fig7_HTML.jpg

图 22-7

运行您的烧瓶代码

现在,你可以点击这个链接看到你的网站:http://127.0.0.1:5000/(图 22-8 )。

img/505805_1_En_22_Fig8_HTML.jpg

图 22-8

你的烧瓶网站

耶!我们的第一个烧瓶程序。img/505805_1_En_22_Figd_HTML.gif

摘要

在这一章中,我们看了用 Python 进行 web 开发。我们简单看了一下用 HTML、CSS 和 JavaScript 创建网站,以及用 Python 的 Flask 创建你的第一个程序。在下一章,让我们用你在本书中学到的 Python 概念创建更多的迷你项目。

二十三、更多迷你项目

在前一章中,我们学习了使用 Python 进行 web 开发。我们简要了解了 HTML、CSS 和 JavaScript,并用 Flask 创建了您的第一个程序。在这一章中,让我们用你在这本书中学到的 Python 概念创建更多的迷你项目。

项目 23-1:带t inter的计算器

img/505805_1_En_23_Figa_HTML.jpg

在这个项目中,我们将创建一个计算器应用,就像你在电脑和手机上看到的带有 Tkinter 的那个。我们开始吧!

  1. 让我们先导入 Tkinter 并创建我们的窗口。我将把 resizable 选项设置为 0 和 0,这样窗口就不能调整大小了。我还打算把标题设为‘计算器’。

  2. 现在,我将创建一个字符串变量( Tkinter 变量)来保存我们的表达式(需要计算)。我还创建了一个空字符串,最初用来存放表达式。我们稍后将使用“字符串”中的值设置 Tkinter 变量。现在,我们让它成为一个字符串,而不是整数或浮点数,因为我们可以使用 Python 中的 eval()方法来计算数学表达式,表达式可以是字符串的形式。

from tkinter import *
w = Tk()
w.resizable(0,0) #cant resize
w.title('Calculator')

  1. 现在,让我们创建我们的按钮。
e = StringVar()
calc = ''

首先,我将创建一个“进入”按钮。它将保存“e”,我们的 Tkinter 变量,让我们将文本对齐到“右”,并在顶部填充足够的外部填充(padx,pady)和内部填充高度(ipady)。

  1. 接下来,让我们创建一个框架,“按钮”,这将举行我们所有的按钮。我们也打包吧。
entry = Entry(w,font=('Arial',14,'bold'),textvariable = e, justify= RIGHT)
entry.pack(side=TOP, ipady = 7, padx = 5, pady = 5)

  1. 现在,让我们开始创建所有的按钮。它们的宽度为 13,高度为 2,我们将为 clear 按钮调用 clear_entry()方法,当单击“答案”或“等于”按钮时调用 get_answer()方法,或者调用 button_click()方法,将数字或运算符添加到表达式中。
buttons = Frame(w)
buttons.pack()

  1. Now that we’ve created our buttons, we should have something like Figure 23-1.

    img/505805_1_En_23_Fig1_HTML.jpg

    图 23-1

    计算器应用–布局

  2. 现在,让我们在函数调用(小部件)上方创建按钮。首先,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)

  1. 最后,用 calc 的当前值设置 Tkinter 变量。这将使表达式出现在应用的输入框中。
def button_click(n):
    global calc
    calc = calc + n

  1. 接下来,对于 clear_entry 方法,我们将再次使“calc”成为空字符串,并将“e”设置为该字符串。
e.set(calc)

  1. 对于 get_answer 方法,让我们导入“calc ”,创建一个变量“ans ”,该变量将使用 eval()方法计算“calc”中的表达式,并将答案设置为“e ”,因此表达式将替换为答案。
def clear_entry():
    global calc
    calc = ''
    e.set(calc)

  1. 最后,让我们将“ans”转换为一个字符串(计算后它将是一个整数或浮点值),并用答案替换“calc”中的表达式,这样我们就可以继续计算。
def get_answer():
    global calc
    ans = eval(calc)
    e.set(ans)

calc = str(ans)

运行程序,你会得到这个(图 23-2 )。

img/505805_1_En_23_Fig2_HTML.jpg

图 23-2

最终计算器应用

就这样!一个非常简单的计算器。事实上,你可以做很多事情来改善这种情况。也许添加一些颜色,解决一些问题,或者添加更多的功能。例如,到现在为止,你可以一个接一个地点击两个操作符,这会给你一个错误。你为什么不创造一个“如果”条件来防止这种情况发生呢?

玩得开心!img/505805_1_En_23_Figb_HTML.gif

项目 23-2:随机故事生成器

在这个项目中,让我们创建一个简单的随机故事生成器。我们将有一堆选项,关于我们的故事“何时”发生,我们的“角色”是谁,我们的“敌人”是谁,我们角色的“属性”是什么,以及代词(他或她或它)。最后,我们要写一个从这些选项中选择的故事,每次我们创建一个新的故事,我们都会得到全新的角色、事件和时间线。够有趣吗?我们开始吧!

  1. 让我们先导入我们的随机模块。

  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']
    
    
  3. 最后,让我们定义一个 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)
    
    
  4. 此外,如果我们的角色是一个精灵,我们需要用“an”和“a”来称呼其余的角色。

    if character == 'elf':
        a = 'an'
    else:
        a = 'a'
    
    
  5. 最后,让我们用多弦创造我们的故事。

    story = '''{} there lived {} {}. {} was very {}. {} fought against the {} and saved {}'. '''.format(when,a,character,pronouns.capitalize(),attributes,pronouns.capitalize(),enemy,saved)
    
    
  6. 现在,让我们把它打印出来。

import random

  1. 现在,对于函数调用,我将创建一个无限 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

很好!虽然很简单。我相信你可以添加更多的选项,让这些故事更大或更随机。玩得开心!img/505805_1_En_23_Figc_HTML.gif

项目 23-3:石头剪刀布游戏

让我们为这个项目创建一个石头剪子布游戏!

  1. 让我们先导入 Tkinter 和随机包。

    #Rock, paper, scissors
    from tkinter import *
    import random
    
    
  2. 现在,让我们创建我们的窗口,将其背景颜色配置为白色,并使其不可调整大小。

    w = Tk()
    w.configure(bg='white')
    w.resizable(0,0)
    
    
  3. 首先,我们需要一个包含标题的标签。

    title = Label(w,text='Rock Paper Scissors', fg="red", bg="white",font=('Arial',45,'bold'))
    title.pack()
    
    
  4. 让我们也创建一个 u_option 变量,它现在是空的,但是以后会保存用户的选项。

  5. 让我们用这三个选项创建一个列表。

u_option = ''

  1. 现在,让我们创建其余的小部件。我们需要另一个标签,上面写着“选择一个”。

    label = Label(w,text='Choose one', fg="green", bg="white",font=('Arial',25,'bold'))
    label.pack()
    
    
  2. 在那下面,我们需要一块画布来放置石头、纸和剪刀。让我们这样做,当用户悬停在画布上时,光标变成一只“手”。

    canvas = Canvas(w,width=500,height=150,background='white')
    canvas.pack()
    canvas.config(cursor='hand2')
    
    
  3. 接下来,让我们使用 PhotoImage 方法加载我们的图像。你可以使用任何你想要的图像。我用了石头、纸和剪刀的插图。

options = ['rock','paper','scissors']

  1. 接下来,让我们将图像绘制到画布中,在我们想要的 X,Y 坐标位置。
img1 = PhotoImage(file="rock.png")

  1. 然后,让我们在该图像上创建一个 tag_bind。对于画布项目,我们需要 tag_bind,而不是 bind。我们的将是一个绑定,用于鼠标左键点击,让我们调用 chose()方法,参数是刚刚被点击的项目。
rock = canvas.create_image(50,20,anchor=NW,image=img1)

我们将在这里使用 lambda,因为绑定需要在它们的函数定义中包含事件,而 lambda 本质上是一个函数定义,所以在这里包含“event”作为 lambda 的属性。

  1. 就这样!让我们为接下来的两张图片重复这个过程。
canvas.tag_bind(rock,'<Button-1>',lambda event:chose('rock'))

  1. 现在,让我们创建最初为空的标签,但稍后将保存我们想要的信息,关于用户的选择、计算机的选择和获胜者。

    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()
    
    
  2. 现在,让我们在小部件上创建 chose()函数。让我们导入 u_option 变量。

    def chose(option):
        global u_option
    
    
  3. 如果 u_option 为空,这意味着用户第一次选择一个选项,我们准备好开始游戏了。我们把期权赋给 u_option。

    if u_option == '':
        u_option = option
    
    
  4. 让我们也为我们的计算机选择一个随机选项,并把它放在 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'))

  1. 现在,让我们用我们的选择来配置 you _ chose 和 c _ chose。

    you_chose.config(text='You chose {}'.format(u_option))
    c_chose.config(text='Computer chose {}'.format(c_option))
    
    
  2. 接下来,我们来看看谁赢了。如果 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 :(')
    
    
  3. 最后,让我们创建我们的“新游戏”按钮。

    new = Button(w,text='New Game',font=('Arial',20,'bold'),command=new_game)
    new.pack()
    
    
  4. 在按钮上方,定义 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 = ''
    
    
  5. 就这样!让我们用一个主循环来结束程序。

c_option = random.choice(options)

w.mainloop()

现在,让我们运行程序(图 23-3 )。

img/505805_1_En_23_Fig3_HTML.jpg

图 23-3

石头剪刀布游戏

当用户点击一个选项时,他们会看到这个(图 23-4 )。

img/505805_1_En_23_Fig4_HTML.jpg

图 23-4

用户选择了一个选项

完美运作!img/505805_1_En_23_Figd_HTML.gif

项目 23-4:用Pygame弹跳球(从四面墙上)

在这个项目中,我们将创建一个从屏幕的四面墙上随机反弹的弹力球。当它碰到屏幕的四面墙中的任何一面时,它应该反转方向并像那样继续。够简单吗?让我们用 pygame 来做这件事。

  1. 我们先导入 pygame,random 和 time。

    import pygame import random
    import time
    
    
  2. 然后,让我们初始化 pygame 并创建我们的屏幕。它的宽度和高度都是 500。

    pygame.init()
    screen = pygame.display.set_mode((500,500))
    
    
  3. 现在,让我们创建一个变量 x 并把它设为 250,一个变量 y 并把它设为 0。这是因为我们想从点 250,0 开始反弹。

    x = 250
    y = 0
    
    
  4. 我们还需要一个“游戏”变量,该变量当前为真,但当用户关闭屏幕时将变为假。

  5. 让我们也创建 x 和 y 方向变量“xd”和“yd ”,它们默认为 1。我们将在范围(1 到 2)(向上移动)和范围(–1 到–2)(向下移动)内增加球的 x 或 y 值。这个变量会改变球的方向。

    xd = 1
    yd = 1
    
    
  6. 现在,让我们创建我们的游戏循环。

game = True

  1. 首先,让我们创建退出条件。如果事件类型是 pygame。退出,让游戏变得虚假。

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game = False
    
    
  2. 然后,让我们用白色填充我们的屏幕。

while game:

  1. 然后,我们用 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)
    
    
  2. 让我们使用 display.update 方法来确保每次循环运行时屏幕都得到更新。

    pygame.display.update() #update the screen in the output window
    
    
  3. 如果我们让游戏保持原样,我们的球会移动得太快以至于人眼看不到。所以,让我们放慢循环的迭代速度。每次迭代后会有 0.005 秒的延迟。

screen.fill((255,255,255))

  1. 现在,让我们设置墙壁碰撞条件。当 x 大于或等于 488 时(因为我们的球的直径为 25,我们需要球的另一半可见,所以我们将其设置为 488 而不是 500),让我们将 x 的值减少 1 到 2 之间的随机值,因为我们需要球向左移动(回到屏幕内部)。所以 xd 是-1。

    if x >= 488:
        xd = -(random.randint(1,2))
    
    
  2. 如果 y > = 488,同样,减小 yd 的值。

    elif y >= 488:
        yd = -(random.randint(1,2))
    
    
  3. 如果 x < = 12,则增加 xd,如果 y 小于或等于 12,则增加 yd。

    elif x <= 12:
        xd = (random.randint(1,2))
    elif y <= 12:
        yd = (random.randint(1,2))
    
    
  4. 最后,一旦我们脱离了 if elif 语句,让我们用“y”的当前值加上“d”。

        x += xd
        y += yd
    pygame.quit()
    
    
time.sleep(0.005)

就这样!运行这个程序(图 23-5 ),你会得到一个从屏幕的四面墙上反弹回来的弹力球。耶!

img/505805_1_En_23_Fig5_HTML.jpg

图 23-5

弹跳球(离开四面墙)

项目 23-5:温度转换应用

对于这个项目,让我们创建一个温度转换应用。我们的应用将有两个功能,一个“摄氏到华氏”转换器和一个“华氏到摄氏”转换器。

  1. 让我们导入 tkinter 并设置我们的屏幕。

    from tkinter import *
    w = Tk()
    
    
  2. 现在,让我们设计我们的应用。这将是一个非常简单的设计。我们将创建两个框架,每个转换器一个。

    frame1 = Frame(w)
    frame1.grid(row=0,column=0,padx=10,pady=10)
    
    
  3. 让我们创建一个标签、一个摄氏温度值的输入框、一个点击时进行转换的按钮和另一个获得结果(华氏温度值)的输入框。

    #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)
    
    
  4. 让我们对下一个转换器重复同样的操作。

    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)
    
    
  5. Run the program, and you’ll get this (Figure 23-6).

    img/505805_1_En_23_Fig6_HTML.jpg

    图 23-6

    温度转换器

  6. 现在,让我们在小部件上创建我们的函数。find_fahrenheit()函数将摄氏温度转换为华氏温度。

  7. 有一个公式可以做到这一点,如下所示:

def find_fahrenheit():

  1. 让我们删除第二个输入框(结果框),以防用户已经进行了转换,并且这是一个新的转换。
#Formula is F = ((9/5)*C)+32

  1. 现在,让我们获取第一个输入框在“C”中的值,并将其转换为一个整数。

    C = entry1.get()
    C = int(C)
    
    
  2. 现在,让我们计算“F ”,并将其插入第二个输入框。就这样!

    F = ((9/5)*C)+32
    entry2.insert(0,F)
    
    
  3. 让我们对 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 )。

img/505805_1_En_23_Fig7_HTML.jpg

图 23-7

转换

有效!img/505805_1_En_23_Fige_HTML.gif

项目 23-6:用文件和Tkinter介绍

这将是一个简单的项目。我们将在您选择的文件夹中创建一个名为 introduction.txt 的文本文件。我们将通过 Python 代码编写对该文件的介绍,最后,我们将创建一个简单的文本应用,它接受文件名(完整的文件路径)并在文本框中打印出该文件的内容。

我们可以开始了吗?

  1. 在我们开始之前,让我们导入 Tkinter 并创建我们的屏幕。

    from tkinter import *
    w = Tk()
    
    
  2. 我将在下面的路径中创建我的文件:G:\\Python\introduction.txt

  3. 我也可以用“x ”,但是我用的是“w ”,这样我就不用再以写模式打开文件了。

  4. 4.然后,我要写苏珊对它的介绍:

    f.write('''Hi, I'm Susan.
    I'm 9 years old.
    My puppy's name is Barky.
    He loves me very very much! :)''')
    
    
  5. 现在,我将创建一个全局变量,每当我在输入框中按 Enter 键时,它将存储文件的内容。现在让我们在其中存储一个空字符串。

f = open('G:\\Python\introduction.txt','w')

  1. 现在,让我们创建我们的小部件。我想要一个在我的输入框左边的标签。因此我把它放在第 0 行第 0 列。

    label = Label(w,text='File name',font=('Arial',12,'bold'))
    label.grid(row=0,column=0,padx = 5, pady=5)
    
    
  2. 我将把我的输入框放在第 0 行第 1 列,让它在四个方向都有粘性,并给所有东西填充。我选择的所有值(宽度、填充等。)都是任意的。你可以测试不同的值,选择你喜欢的。

    entry = Entry(w,width=65)
    entry.grid(row=0,column=1,sticky='nsew', padx = 5, pady=5)
    
    
  3. 最后,让我们为我的条目创建一个绑定。每当我按下键盘上的 Enter 键(Mac 中的命令)时,我都想调用我的 get_file 函数。您需要使用''条件来实现这一点。

f_content = ''

  1. 最后,让我们创建文本小部件。我将为我的文本设置一些默认样式,并将其放在第 1 行第 0 列,使其跨越两列(因此它占据了前两个小部件的整个宽度)。

    text = Text(w,font=('Arial',14,'bold'))
    text.grid(row=1,column=0,columnspan=2)
    
    
  2. 好了,现在我们完成了小部件,让我们定义 get_file 函数。定义在调用函数上面好吗?

entry.bind('<Return>',get_file)

因为我们创建了一个绑定,所以我们的函数需要接收“事件”。将 f_content 加载到函数中。

  1. 首先,从输入框中获取文件名。然后,以读取模式打开该文件,并将其内容存储在 f_content (f.read())中。

    file = entry.get()
    f = open(file,'r')
    f_content = f.read()
    
    
  2. 最后,将 f_content 中的内容插入到文本框中。我们使用“end”来插入全部内容。

def get_file(event):
    global f_content

text.insert('end',f_content)

就这样!

现在让我们运行我们的程序(图 23-8 )。

img/505805_1_En_23_Fig8_HTML.jpg

图 23-8

Tkinter app 布局

我们的小部件就在我们想要的地方!让我们看看我们的程序现在是否工作(图 23-9 )。

img/505805_1_En_23_Fig9_HTML.jpg

图 23-9

导入文件内容

是的,确实如此。我输入了我的文件路径(确切的路径)并按下 Enter 键,我的文件内容显示在我的文本框中。完美!img/505805_1_En_23_Figf_HTML.gif

摘要

在这一章中,我们使用 TkinterPygame 创建了六个应用。我们创建了一个计算器,一个随机故事生成器,一个石头剪刀布游戏,一个文件上传应用,一个温度转换应用和一个弹力球。

在下一章,我们来谈谈你的 Python 之旅的下一步。我会给你一些关于你接下来需要学习的东西的想法,我也会给你一些关于你可以自己工作的更多迷你和顶点项目的想法。

二十四、下一步是什么?

在前一章中,我们用 Python 创建了更多有趣的迷你项目。在这一章中,让我们看看接下来会发生什么。我将为您提供更多的 mini 和 capstone 项目想法供您尝试,并且让我们简单地讨论一下如何从这里继续您的 Python 之旅。

迷你项目的想法你可以试试

Python 是一种非常有趣的编程语言,你可以做任何你想做的事情。

迷你项目和拼图是积累 Python 专业知识的好方法。在这本书里,你已经创建了很多迷你项目。为什么我不给你一些想法来创建你自己的迷你项目呢?

货币兑换应用

你可以用这个项目。尝试为尽可能多的货币创建转换选项。

你可以把它做成一个单行的应用,在文本框旁边有下拉菜单(就像你在谷歌的货币转换应用中看到的那样)。下拉列表将列出所有货币选项。根据两边的选择,进行转换。

简单吧?尽可能自动化,也就是尽可能减少代码行。

参加 Pygame 的比赛

我们在一个迷你项目中创建了一个海龟比赛,记得吗?你为什么不用的 Pygame 做同样的尝试,但是这次要做得更好?用线创建适当的跑道,并将您的有色玩家(可以是矩形)放在跑道的起点。

也许你也可以创建一个开始按钮,点击它,让你的玩家比赛(让他们随机移动),最后,根据谁赢了,创建一个玩家颜色的“游戏结束”屏幕。

很简单,不是吗?试试看!

更多图案在turtle

你记得我们在早期项目中创造的曼荼罗模式吗?你为什么不试着创造更多这样的图案呢?让它们变得更复杂。您已经知道可以使用 for 循环来自动化模式。

您可以创建不同的图案(圆形和方形)并将它们随机组合在一起(使用函数调用)。

顶石项目的想法你可以试试

我们已经看到了如何在turtle中创建贪食蛇游戏,但是正如你现在看到的, Pygame 更适合任何游戏,那么你为什么不尝试在 Pygame 中创建同样的游戏呢?

Pygame 中的贪食蛇游戏

创建它应该很简单。为蛇头和身体部位(包括苹果)绘制矩形,让它们移动(你已经知道如何移动),当蛇头叠加苹果时创建一个记分牌,同时让蛇增长一个身体部位,最后如果有碰撞(墙壁或身体碰撞)就结束游戏。

躲避子弹

为什么我们不用 Pygame 创建一个反向的太空游戏呢?不是向外星人开枪,而是一群外星人向你开枪。你没有弹药了,你现在唯一能做的就是躲开雨点般的子弹(从每艘外星飞船上随机发射,这样你就不知道哪艘要射向你),而这正是你要做的。

比方说,你有十条命,每次子弹击中你,你就失去一条命。坚持的时间越多,分数越高。很有趣,但很简单,你不觉得吗?让游戏变得如你所愿的简单或困难。

记忆游戏 Pygame

这是一个有趣的小游戏,你可能在街机上玩过。创建偶数编号的框。每个盒子后面都藏着一幅图像,但有一个问题。每个图像有两个,你需要匹配它们。

当用户开始游戏时,在指定的时间限制内(可能是 5-10 秒)显示隐藏在盒子后面的所有图像,这样用户就可以看到它们在哪里。然后,再藏起来,游戏就开始了。现在,用户需要匹配图像。

用户第一次点击其中一个框时,它后面的图像就会显示出来。他们必须在下一次点击有相同图像的盒子。如果他们不这样做,如果下一个被显示的图像是不同的图像,这两个图像将再次被隐藏,他们可以重新开始。

如果他们一个接一个地点击隐藏相同图像的相同方框,那么这些方框将不会再被隐藏,他们就获得一分。

他们需要在给定的时间限制内匹配所有像这样的盒子(通常一组 10 张图像需要 30 秒)。

有趣吗?试试看!img/505805_1_En_24_Figa_HTML.gif

展望未来

好了,我们到了书的末尾。到目前为止,您已经学习了 Python 的基础知识,所有关于 TurtleTkinterPygame 的知识,并且您还创建了项目来熟悉这些主题。下一步是什么?你应该如何继续你的旅程?让我给你一些建议。

详细的哎呀

我们确实学习了对象和类,但是我们没有更深入地研究这个主题,一点也没有。如果你想做真正的编程,OOPs 会给你很大的帮助。对于任何编程语言来说,这也是一项宝贵的技能,更不用说 Python 了。

那么,为什么不从在更多的项目中使用类开始,看看它们是如何转换代码的呢?接下来,拿起一本好的 Python 面向对象编程的书,继续你的旅程。

正则表达式

在任何编程语言中,正则表达式都是一个非常有趣的高级话题,尤其是 Python。这基本上是一个扭曲的模式匹配。

您是否想知道程序如何知道您的密码没有指定数量的字母、数字和特殊字符,以及它们如何能够指出其中一个字符是否是大写字母?魔法?不,这是你的正则表达式模式匹配。

课题研究。我肯定你会发现它很有趣。

Web 开发

我已经向您介绍了 web 开发的基本知识,但是您可能已经猜到了,我们仅仅触及了皮毛。还有很多东西要学,还有很多事情要做。

就 web 开发而言,世界是你的。深入研究 HTML、CSS 和 JavaScript,了解更多关于网站设计和开发的知识。然后,使用 Django 或 Flask 作为后端,使用 MongoDB 为程序创建和维护数据库。一旦你学会了这个主题,试着创建项目(也许是一个社交媒体网站或一辆购物车)。这是一个需要几个月才能学会的庞大话题。一步一步来。

详细包装

是的,我们已经在一定程度上看过turtleTkinterPygame 。但是还有很多要学的。因此,我建议创建更多的项目(不仅仅是本书中提到的那些),当你遇到更多的问题时,你会寻找更多的解决方案(或语法)来解决它们,你会更深入地研究你正在处理的每个包。

玩得开心!img/505805_1_En_24_Figb_HTML.gif

摘要

在这一章中,我给了你更多关于迷你和顶点项目的想法,你可以尝试自己创造。然后,我给了你接下来可以学习的方向。

就这样!我们已经到了这本书的结尾。我希望你和我一起学习 Python 很开心。不要停止学习和创造,但更重要的是,永远不要停止享受乐趣!img/505805_1_En_24_Figc_HTML.gif