独书先生 Menu

Python in Excel 中的公开预览:将 Python 和 Excel 分析有机结合

Python 是当今最受欢迎的编程语言之一,深受企业和学生的喜爱,而 Excel 是一种必不可少的工具,用于组织、操作和分析各种数据。然而,直到现在,还没有一种简单的方法可以让这两个世界共同运作。

今天,我们非常高兴地介绍Python in Excel 中的公开预览——在同一 Excel 网格中实现 Python 和 Excel 分析的集成,以实现连续的工作流程。

Python in Excel 中将 Python 强大的数据分析和可视化库与您熟悉和喜爱的 Excel 功能相结合。您可以使用 Python 绘图和库在 Excel 中操作和探索数据,然后使用 Excel 的公式、图表和数据透视表进一步优化您的洞察力。

无缝工作

现在,您可以通过直接从 Excel 功能区访问 Python 在熟悉的 Excel 环境中进行高级数据分析。无需设置或安装。使用 Excel 内置的连接器和 Power Query,您可以轻松将外部数据带入 Python in Excel 工作流程中。

我们与 Anaconda 合作,Anaconda 是一家领先的企业级 Python 软件包库,全球数千万数据从业者在使用。Python in Excel 利用在 Azure 中运行的 Anaconda 发行版进行 Python 运行,其中包括最流行的 Python 库,如用于数据操作的 pandas,用于高级统计建模的 statsmodels,以及用于数据可视化的 Matplotlib 和 seaborn。

要查看机器学习和可视化示例,并了解更新,请访问 Excel 官方博客…

缩略图图像1标题:通过Python in Excel中无缝汇总和可视化您的数据。通过 Python in Excel 中无缝汇总和可视化您的数据。

轻松协作

在您喜爱的工具(如 Microsoft Teams 和 Microsoft Outlook)中共享工作簿和 Python 分析。通过评论和@提及无缝协作,与同事一起进行协同编辑,就像在 Excel 中一样。即使没有激活 Python in Excel,团队成员也可以刷新 Python in Excel 中的分析以获取最新信息。

缩略图图像2标题:通过评论和@提及轻松协作通过评论和@提及轻松协作

自动获得企业级安全性

保护您的数据是我们的首要任务,因此我们在 Python in Excel 的设计核心注入了安全性和隐私性。Python in Excel 在 Microsoft Cloud 上运行,作为 M365 连接体验,拥有企业级安全性。

在此了解有关我们数据安全性的更多信息

缩略图图像3标题:使用Python绘图可视化您的数据使用 Python 绘图可视化您的数据

查看客户和合作伙伴对 Python in Excel 的评价

缩略图图像4,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

麦金尼 – “在 Excel 中运行 Python 简化了麦金尼的报告工作流程。我们过去需要在 Jupyter Notebook 中操作数据结构、筛选和汇总数据,然后在 Excel 中创建可视化效果。现在我们可以在 Excel 中管理整个工作流程。这将使 Excel 变得更加强大,并使 Python 在整个组织中更加易于使用。作为我职业生涯中最令人兴奋的更新,Python 支持是 Excel 的最大亮点!” – Greg Barnes,数据和分析执行总监

缩略图图像5,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

麦格劳·希尔 – “麦格劳·希尔的理念是为所有人提供教育,我们与微软的合作有助于改善学生访问 Excel 工具,提高职业就业能力。Python 是大学和学院最需求的技能之一,我们对 Excel + Python 的组合感到非常激动,它将为教育工作者和学生提供一个强大的新途径,以更快地进行分析,实现更大的协作和学习,最终将学生引向更加光明的未来。” – Rebecca Olson,高级投资组合总监

缩略图图像6,标题为:介绍Python in Excel:数据分析和可视化的最佳结合

毕马威 – “毕马威和微软正在大力投资于提供先进的基于云的税务技术。在毕马威,我们对 Python in Excel 中的影响感到兴奋,这对我们的税务客户来说意义重大。在 Microsoft 云提供的数据和安全性承诺的支持下,Python 有可能增强高级分析的 Excel 体验,同时为公司提供透明度、简易性和对财务状况更深入的洞察力。” – Tejas Varia,税务数据与分析主管

而我们的工作才刚刚开始。敬请期待更多令人激动的消息!

通过 Python in Excel 使您的数据分析更加强大,讲述更好的故事。

开始使用 Python in Excel

对于在 Microsoft 365 Insiders 计划 Beta 频道中的人们,Python in Excel 正在进行公开预览。此功能将首先在 Windows 版的 Excel 中推出,从构建 16818 开始,然后在以后的日期推出到其他平台。

要使用 Python in Excel,加入Microsoft 365 Insiders 计划。选择 Beta 频道 Insider 级别,以获取 Excel 应用程序的最新版本。

安装最新的 Excel Insider 构建后,打开一个空白工作簿,然后执行以下步骤。

  1. 在功能区中选择“公式”。
  2. 选择“插入 Python”。
  3. 在弹出的对话框中选择“尝试预览”按钮。

还没有收到吗?这可能是我们的问题,而不是您的问题。功能会随着时间的推移发布,以确保一切正常运行。我们会突出显示您可能尚未拥有的功能,因为它们会逐渐发布给更多的内测人员。有时根据您的反馈,我们也会移除某些元素以进行进一步的改进。尽管这很少见,但我们还保留了在产品中完全取消某个功能的选择权,即使作为内测人员,您也有机会尝试它。

在预览版中,Python in Excel 将包括在您的 Microsoft 365 订阅中。在预览版之后,某些功能将在没有付费许可证的情况下受到限制。有关在正式发布之前将提供更多详细信息。

加入 Microsoft 365 Insiders 计划。成为第一个了解 Microsoft 365 应用程序和服务中的下一步内容的人,分享您的反馈,并加入我们的内测社区!

注册以获取有关 Python in Excel 未来可用性的通知

下一步的期望

如上所述,我们正在向 Insiders Beta 频道公开预览 Python in Excel,因此您应该期望很快会有新的功能。请关注以下领域的更新:改进的编辑体验(例如自动完成和语法突出显示)、默认修复、增强的错误行为、帮助和文档等。此外,为了防止滥用,系统目前具有一些数据大小和计算限制,我们将密切监控并进行调整。

我们需要您的反馈!Excel 和 Python 用户可以在应用程序内直接提供反馈(转到“帮助”>“反馈”),在我们的反馈门户上提出改进建议,或在GitHub上与我们的团队互动。

其他资源

Python in Excel 简介

开始使用 Python in Excel

了解更多关于 Anaconda 的信息

Python Tkinter 表格组件

需求

我想在 tkinter 做的 python GUI 程序中加入一个表格,由于官方库没有表格这个组件,只能找社区组件或者自己造一个表格组件。

方案一

通过 grid 布局功能,造一个简单的表格。缺点是和其他组件配合构造 GUI 就不太方便。

使用

from tkinter import *

root = Tk()

height = 10
width = 5
cells = {}
for i in range(height): #Rows
    for j in range(width): #Columns
        b = Entry(root, text="")
        b.grid(row=i, column=j)
        cells[(i,j)] = b

mainloop()

方案二

采用社区已有组件 tksheet,一个用 tkinter canvas 手动绘制的表格

github 地址:https://github.com/ragardner/tksheet

支持多达数亿个单元格的大数据渲染,只重绘表格的可见部分,所以能运行得相当流畅。

还支持单元格颜色和背景。

使用

确保 Python 3.6+版本,安装依赖

pip install tksheet

使用

from tksheet import Sheet
import tkinter as tk


class demo(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.grid_columnconfigure(0, weight = 1)
        self.grid_rowconfigure(0, weight = 1)
        self.frame = tk.Frame(self)
        self.frame.grid_columnconfigure(0, weight = 1)
        self.frame.grid_rowconfigure(0, weight = 1)
        self.sheet = Sheet(self.frame,
                           data = [[f"Row {r}, Column {c}\nnewline1\nnewline2" for c in range(50)] for r in range(500)])
        self.sheet.enable_bindings()
        self.frame.grid(row = 0, column = 0, sticky = "nswe")
        self.sheet.grid(row = 0, column = 0, sticky = "nswe")


app = demo()
app.mainloop()

tksheet

参考

Python一键下载视频脚本分享

需求

小编通常会上一些专业的视频网站比如腾讯视频、优酷,在上面看电影、电视剧。这些网站有个优点,可以缓存视频,在通勤路上比如地铁就可以愉快的刷剧了,因为地铁上的网速通常不怎么好。

但是有一些经典电影或者电视剧,这些视频并没有提供,那么我们只能上一些小电影网站看了,资源是有了,但是问题来了,这些小电影网站大多数都没有视频下载功能,那在地铁上就没法看了。

如果可以把这些视频下载下来,再传输到手机里不就可以离线看了吗?

接下来小编就演示下如何用 python 脚本来实现一键下载小电影网站的视频。

以下脚本可以学习到

  • python selenium 的使用
  • python requests 的使用
  • 分片下载视频存储本地
  • 实时输出视频下载进度

注意:

  1. 这里的脚本主要用于测试学习目的,切勿用于生产环境等商业目的

  2. 推荐大家访问官方指定平台或专业视频网站,支持正版

解决方案

小编以经常看的在线之家为例,这个网站可以找到很多美剧资源。

首先,我们用谷歌浏览器打开一个视频地址,比如https://www.zxzj.fun/video/1529-1-1.html,按F12或者右击“检查”打开浏览器控制台

video url

然后,点击控制台最左边的选择元素按钮,或者按Ctrl + Shift + C,选择网页的视频区域,就能看到video标签

<video
  class="dplayer-video dplayer-video-current"
  webkit-playsinline=""
  playsinline=""
  preload="metadata"
  src="https://vod.pipi.cn/8f6897d9vodgzp1251246104/1881b495387702292624167851/f0.mp4"
></video>

可以发现src属性值就是视频链接,并且是采用单独的.mp4视频地址,这种地址原理上可以直接从浏览器下载的,直接复制这个地址在浏览器打开,就可以右击下载。但是电视剧通常有很多集,每次都手动打开网页-打开控制台-复制视频地址-再打开视频-最后下载视频,就很繁琐。这时候就是脚本排上用场的时候了,可以把这个流程自动化,简化重复操作的过程。

脚本的整体思路

  • 使用selenium打开网页
  • 通过selenium元素选择器找到video标签所在的iframe,切换到iframe
  • 通过video标签,获取到视频地址,然后请求视频内容
  • 采用分片下载的方式拼接视频存储到本地

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests
# 谷歌浏览器驱动
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# sleep模块,让程序停止往下运行
from time import sleep

# 设置谷歌浏览器驱动
driver = webdriver.Chrome()

# 手动改为想要下载的视频所在网页地址
url = 'https://www.zxzj.fun/video/1529-1-1.html'

# 打开网页
driver.get(url)

try:
  # 通过元素选择器找到iframe
    iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, '#playleft iframe'))
    )
except:
    driver.quit()

# 获取到网页title,便于直观看到当前下载的视频标题
title = driver.find_elements(By.TAG_NAME, 'title')[
    0].get_attribute('innerHTML')

# 切换到iframe
driver.switch_to.frame(iframe)

# 通过video标签获取视频地址
video = driver.find_elements(By.TAG_NAME, 'video')[0]
video_url = video.get_attribute('src')
print('video', video_url)

# 已经获取到视频地址,可以关闭浏览器
driver.quit()

# 设置请求头信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}

# 请求视频内容
video_content = requests.get(video_url, headers=headers, stream=True)

print("开始下载")

# 视频大小
contentLength = int(video_content.headers['content-length'])

line = '大小: %.2fMB'

# 大小换算
line = line % (contentLength/1024/1024)

# 打印视频总长度
print(line)

# 存储已经下载的长度
downSize = 0

print('video_name', title)

# 分片下载
with open(title+'.mp4', "wb") as mp4:
    for chunk in video_content.iter_content(chunk_size=1024 * 1024):
        if chunk:
            mp4.write(chunk)

            # 记录已下载视频长度,实时输出下载进度
            downSize += len(chunk)
            print('进度:{:.2%}'.format(downSize / contentLength), end='\r')

print("下载结束")

总结

以上简单展示了使用 python 的requestsselenium库来下载一个mp4视频,可以当做一个学习案例。

其中还有很多待改进的地方

  • 每次运行脚本只能解析下载一个视频,或许可以改进为批量解析出一个视频列表来下载
  • 换视频地址下载,需要手动改源码的url地址,可以改进做一个界面交互来让用户输入
  • 当前只适配了特定网站的视频地址解析,其他地址不支持,可以改进针对不同的网站单独出解析函数来匹配

后续有时间再来分享更多有趣实用的 python 脚本。

参考

Pyodide 中实现网络请求的 3 种方法

原文:https://lwebapp.com/zh/post/pyodide-fetch

需求

小编之前提过一个在线 Python 工具,核心技术是用到了一个叫 Pyodide 的库,能够让 Python 在网页上运行,但是小编在学习过程中发现,并不是所有 Python 内置库或者扩展库都能运行,比如 requests是不支持的。
Continue reading…

网页版 Python 图片转字符画

需求

最近发现一个好玩的 Python 玩法,用 Python 将图片转为字符画,大多数都是本地程序,因为之前小编搭建过一个在线版的 Python,于是尝试了使用在线版的 Python 实现了图片转字符画。

在线 Python 编辑器: https://lwebapp.com/zh/python-playground

Continue reading…

分享一个好用的Python在线编辑器

原文:https://lwebapp.com/zh/python-online

需求

有小伙伴可能听说过 PyScript,知道了Python可以通过打包成wasm运行在浏览器端了,这样做一些需要Python来做的功能,可以直接在浏览器完成,无需和服务器交互,打开了开发者的想象力。

这里我们要推荐的是一个在线工具,也是支持Python代码的执行,一个在线的Python代码编辑器

Continue reading…

pip 安装第三方库报错最全解决方案

问题

我们在使用 Python 开发的时候,通常会用到一些好用的第三方库,推荐用 pip 来安装,比如安装 pandas

python -m pip install pandas

一般情况下都没有什么问题,但是有些小伙伴会碰到 pip 安装第三方库报错、pip install 卡住不动等安装失败的情况。

比如以下是 pip 安装第三方库报错的代码

Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None))...

小编在这里就总结下 Python 安装第三方库失败的解决方案有哪些。

解决

方案一

Python 环境因素报错,检查你的电脑下的 Python 和 pip 是否是正常安装好的

# 打印当前Python版本
python --version

运行以上命令如果正常打印出了 Python 版本信息,表明是正常的。报错的话,可能是在 Windows 下安装 Python 的时候环境变量没有配置,可以配置下 Python 环境变量,或者直接把 Python 重新安装到 C 盘,这样就不会有环境变量的问题。

# 打印pip版本
python -m pip --version

运行以上命令如果正常打印出了 pip 版本信息,表明是正常的。报错的话,可以用这个命令安装升级下

python -m ensurepip --upgrade

如果还不能运行 pip,也可以手动安装 pip

  1. 打开 https://bootstrap.pypa.io/get-pip.py
  2. 右击页面–另存为–保存到任何地方
  3. 在 get-pip.py 文件所在目录的命令行执行 python get-pip.py就能成功安装 pip

手动安装 pip 还有个好处,可以直接使用全局 pip 来安装依赖包,比如

pip install pandas

方案二

pip 虽然正常安装了,但有时候会提示你的 pip 版本过低

WARNING: You are using pip version 22.0.3; however, version 22.0.4 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.

运行以下命令升级 pip

python -m pip install --upgrade pip

方案三

第三方包名称或者版本号输入错误,比如我在命令行终端安装一个叫 padas 的包

python -m pip install padas

会出现以下报错

ERROR: Could not find a version that satisfies the requirement padas (from versions: none)
ERROR: No matching distribution found for padas

这个错误提示我输入了 padas,提示找不到这个包和它的版本号。这时需要检查包名称是否输入正确,正确的应该是 pandas。(当然文章发布之后,可能有开发者朋友发布了这个包,这里仅仅作为演示)

还有版本号也可能不存在的问题,比如我安装一个高版本的 pandas

python -m pip install pandas==6.5

会出现以下报错

ERROR: Could not find a version that satisfies the requirement pandas==6.5 (from versions: 0.1, 0.2, 0.3.0, 0.4.0, 0.4.1, 0.4.2, 0.4.3, 0.5.0, 0.6.0, 0.6.1, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.8.0, 0.8.1, 0.9.0, 0.9.1, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.14.0, 0.14.1, 0.15.0, 0.15.1, 0.15.2, 0.16.0, 0.16.1, 0.16.2, 0.17.0, 0.17.1, 0.18.0, 0.18.1, 0.19.0, 0.19.1, 0.19.2, 0.20.0, 0.20.1, 0.20.2, 0.20.3, 0.21.0, 0.21.1, 0.22.0, 0.23.0, 0.23.1, 0.23.2, 0.23.3, 0.23.4, 0.24.0, 0.24.1, 0.24.2, 0.25.0, 0.25.1, 0.25.2, 0.25.3, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.2.0, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.4.0rc0, 1.4.0, 1.4.1)
ERROR: No matching distribution found for pandas==6.5

很明显找不到这个版本号,而且把所有可以安装的版本号都告诉你了,我们只需要选择一个我们需要的版本号就可以,或者不指定版本号默认安装最新版本。

方案四

每个地方的网络质量、通信速度都不一样,pip 安装依赖包也会遇到网络超时问题,比如以下报错

raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='pypi.org', port=443): Read timed out.

表明是网络超时了,提示连接到 pypi.org 出了问题,这个就是托管 python 依赖包的网站,所有的 pip 包都发布在上面。

我们可以设置加长超时时间,因为大多数地方的网络并不是完全连接不上,只是速度有点感人。这里将默认的超时时间 --default-timeout 设置为 200s

python -m pip --default-timeout=200 install pandas

设置多一点的超时时间,去喝杯茶慢慢等一等,就可能下载好了。

方案五

如果喝完茶后还没下载好,接着考虑换镜像源了,比如我们切换到清华大学的镜像源

# --index-url可以简写为-i
python -m pip install --index-url https://pypi.tuna.tsinghua.edu.cn/simple/ pandas

除了官方源和清华镜像源

  • 清华:https://pypi.tuna.tsinghua.edu.cn/simple/
  • 官方:https://pypi.org/

还有些别的镜像源可以尝试

  • 阿里云:https://mirrors.aliyun.com/pypi/simple/
  • 豆瓣:https://pypi.douban.com/simple/
  • 北京外国语大学 https://mirrors.bfsu.edu.cn/pypi/web/simple/

方案六

除了切换镜像源之外,pip 官方还提供了多种安装依赖包的途径

  1. 将依赖包提前下载好,然后从本地路径直接安装

比如我们可以从 pip 官网下载 pandas 的发行包文件,然后在本地依赖包所在目录执行安装命令。

从源码包安装

python -m pip install pandas-1.4.1.tar.gz

或者从构建包安装

# 仅用于 Windows 平台的构建包
python -m pip install pandas-1.4.1-cp310-cp310-win_amd64.whl

所有的 pandas 分发包列表:pandas download files

  1. 从任何的 VCS(version control systems 版本控制系统)安装,使用如下格式
python -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
  • vcs:版本控制系统名称
  • protocol:协议
  • repo_url:仓库地址
  • egg:包名称
  • subdirectory:如果包不在项目根目录,指定子目录名称

比如直接从 github 安装 pandas 库

python -m pip install git+https://github.com/pandas-dev/pandas.git#egg=pandas

这种方式会从 github 上拉取最新代码做本地构建,需要的时间比较长,一般也是开发版本。

官方支持非常多的版本控制系统和协议,详细查看 VCS 支持

  1. 从 github 安装还支持手动本地安装,将依赖包的 github 仓库直接 clone 下来,在项目目录中执行
python setup.py install

这样就直接安装了这个项目所构建的库,本质上和用 github 远程方式差不多,都需要做本地编译,通常用作本地开发阶段使用,或者想尝试下项目最新特性。

不过如果你通过 pip install 的方式就有网络问题,这种通过 github 安装的方式通常也有一定网络问题。

方案七

小编尝试了上面几种方案,都无法很完美的满足我的需求,

  • 虽然设置了很长的超时时间,但是有时候网络就是很慢,超时再长也很浪费时间
  • 镜像相比较官方站有一点延后的同步时间,官方 pypi.org 的依赖包最为稳定,同样的问题在前端开发的 npm 包管理中也很常见,镜像源有时候会出现不可预测的错误,而往往切换到官方源就修复了(参照 npm install 报错卡住
  • 直接下载源码包构建的话,因为很多 Python 库都是外国人写的,网站不在本国家,访问其他国家网站的时候下载速度很慢,从 github 下载也是一样的情况(参照 github clone 很慢

我们可以考虑一些更科学的上网方式,来加快对官方网站的访问速度。加速之后直接使用pip install安装任何第三方库,基本上几秒钟就可以完成,无需设置超时时间,不需要切换镜像源,无需担心安装包版本延迟问题,想从 pip 官网下载源码包或者使用 github 远程安装 Python 第三方库都非常快。

除此之外,还有以下好处

  • 你在访问一些 Python 第三方库的文档的时候,也可以加快访问速度,比如 pandas 官网 https://pandas.pydata.org/
  • 上 github 学习开源项目源码,使用 git clone 来拉取 github 开源项目的时候,速度提升明显
  • 使用谷歌搜索出的技术文档往往更精准,排在搜索结果前面的都是 stackoverflow 上的高赞回答,非常有用
  • 访问其他一些优秀的技术网站

更科学的方式推荐:官方网站 ➜

不太明白的请参考这位小编的 踩坑经验 ➜

参考

实现人手一个冰墩墩python画冰墩墩源码

背景

最近北京冬奥会正在举行,北京冬奥会的吉祥物“冰墩墩”非常抢手,很多朋友连夜排队都抢不到一个冰墩墩。

冰墩墩实在太火了,为了实现冰墩墩自由、“人手一墩”的梦想,强大的程序员GG奉上了一个用Python绘制冰墩墩的程序,先看下面这个动图体会下

真是太强大了,网友真是无所不能

思路和代码

技术上主要用到了python的turtle和tkinter模块,这两个模块都是Python内置的模块,非常强大。

  • turtle用来绘图,有多种绘制方式和样式
  • tkinter用来构建GUI程序,也内置了许多组件

主程序基本上就是采用turtle,设置不同的画笔和路径等绘制方式,一笔一笔接着在初始化好的tkinter Canvas画布上画出来的。核心功能也就完成了。

先启动一个tkinter界面,放置一个Canvas画布,再将turtle绘制区域设置到这个Canvas上

root = Tk()
root.geometry('600x700+500+60')
root.config(bg='white')
root.title('lwebapp.com')
root.resizable(False, False)
canvas = Canvas(root, width=600, height=600)
canvas.place(x=0,y=50)

t = RawTurtle(canvas)
t.hideturtle()

完整的代码到源码的main.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/main.py)文件查看

接着就是核心的绘制代码,由于代码太长这里贴出一部分

def draw_bdd(t):

    # reset
    t.penup()
    t.home()
    t.clear()

    # adjust the speed
    t.speed(30)

    # left hand
    t.goto(177, 112)

    t.pencolor("lightgray")

    t.pensize(3)

    t.fillcolor("white")

    t.begin_fill()

    t.pendown()

    t.setheading(80)

    t.circle(-45, 200)

    t.circle(-300, 23)

    t.end_fill()

完整的代码到源码的draw.py(https://github.com/openHacking/TKinter-UI/blob/main/demo/draw_bdd/draw.py)文件查看

最后,用 pytxui 这个python GUI组件库放了两个样式更美观的按钮做重新绘制和下载功能。

下载功能用到了Pillow的ImageGrab截图功能,可以将Canvas上的冰墩墩绘制结果保存为一张PNG图片。

核心的截图保存代码

from PIL import ImageGrab
import os

def save_image(root,widget):
    root.update()
    x=root.winfo_rootx()+widget.winfo_x()
    y=root.winfo_rooty()+widget.winfo_y()

    x1=x+widget.winfo_width()
    y1=y+widget.winfo_height()
    offset = 4
    ImageGrab.grab().crop((x + offset,y + offset,x1 - offset,y1 - offset)).save(os.getcwd() + "\\bdd.png", "PNG")

源码

pytxui-draw_bdd (https://github.com/openHacking/TKinter-UI/tree/main/demo/draw_bdd)

总结

以上我们结合当前大火的冰墩墩学习到了Python相关的知识

  • turtle和tkinter结合使用构造GUI
  • 如何构造一个漂亮的GUI按钮组件
  • 如何将tkinter Canvas画布下载为图片

其中还有很多不足,欢迎给作者多提建议和想法,一起学习提高。

参考

  • pytxui (https://github.com/openHacking/TKinter-UI)

Python + Selenium 自动化测试《人生重开模拟器》

背景

最近有一款小游戏特别火,叫《人生重开模拟器》,这款游戏用黑色幽默的调侃形式,随机生成你的人生大事件列表,开场还能抽取天赋加点,趣味性十足。

因为官网访问流量过大,有的朋友出现访问白屏、网页失效的情况,小编在这里发一个最新的人生重开模拟器在线链接:

https://dushusir.com/life/

不停地重开自己的人生之后,小编想着能不能写个脚本来自动化运行这款游戏,因为是纯网页操作,所以可以使用Python和Selenium组合的自动化测试神器来测试下。

思路

因为本质上这个游戏是一系列的网页操作,所以实现起来比较简单,就当是复习下Selenium的基本元素操作。想入门Python的童鞋可以看下,

以前小编写过一个 Python+Selenium自动化测试合成大西瓜一样可以作为学习。

注意:这不是一个智能的提高游戏分数的脚本,只是一个演示自动化测试学习案例,帮助大家更好的理解selenium的用法。

开发环境

  1. 下载Python并安装
  2. 安装pip
  3. 安装Selenium和浏览器webdriver

mac平台和windows平台有所不同,安装时注意下环境。细节问题这里就不列出了,大家多用户谷歌。

如果下载Python或者pip安装比较慢的,可以参考下这篇博文进行加速。

安装py模块神器

代码

环境准备好之后,直接复制以下代码到.py文件里,比如main.py,执行
python main.py即可启动webdriver运行自动化人生重开模拟器。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 谷歌浏览器驱动
from selenium import webdriver


# sleep模块,让程序停止往下运行
from time import sleep

# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)


driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/life')

# 隐式等待
driver.implicitly_wait(5)

# 点击 立即重开
restart = driver.find_element_by_id('restart')
restart.click()

sleep(1)

# 点击 10连抽
driver.find_element_by_id('random').click()

sleep(1)

# 随机1-10数字,用于抽中天赋卡

randomOne = random.randint(1,3)
randomTwo = random.randint(4,6)
randomThree = random.randint(7,10)

# 找到三张天赋卡按钮并点击
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomOne) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomTwo) +")").click()
driver.find_element_by_css_selector("#talents li:nth-of-type("+ str(randomThree) +")").click()

# 点击确认:“请选择3个”
driver.find_element_by_css_selector("#next").click()

sleep(1)

# 点击随机分配
driver.find_element_by_css_selector("#random").click()

sleep(2)

# 开始新人生
driver.find_element_by_css_selector("#start").click()

# 持续点击人生大事件列表区域,直到列表区域内容不再增加,即表明人生结束
isOver = False # 结束标识
life = 0 # 前一个life长度

while(not isOver):

    # 点击列出人生大事件
    driver.find_element_by_css_selector("#lifeTrajectory").click()
    print('点击一次'+str(life))

    sleep(1)

    # 注意必须使用find_elements,不是find_element,否则len方法会报错
    li = driver.find_elements_by_css_selector("#lifeTrajectory li")

    currt_life = len(li)

    # 如果列表在继续增加,则继续点击;一旦不再增加,表明你挂了
    if currt_life > life:
        life = currt_life
    else:
        isOver = True
        print('结束')

# 点击人生总结
driver.find_element_by_id('summary').click()

sleep(5)
driver.quit()

总结

程序写的比较粗略,很多细节还没有完善,不过可以作为小案例参考,也欢迎大家批评指出问题。后续有时间再分享更多有用的测试脚本和好玩的游戏。

参考

Python+Selenium自动化测试合成大西瓜

问题

最近想要试一下玩合成大西瓜小游戏,就想能不能自动化运行这个游戏。相当于写一个自动化测试合成大西瓜的脚本,随机点击位置然后触发点击即可。

解决方案

直接采用自动化测试工具Python+Selenium,环境安装方法请参考 Selenium+Python自动化测试(一)

注意:这不是自动完成合成大西瓜的脚本,只是一个演示随机点击的自动化测试学习案例,帮助大家更好的理解selenium的用法。

合成大西瓜小游戏链接:https://dushusir.com/xigua/

(手机端使用微信或者自带浏览器打开即可开始游戏,PC端打开后用F12开启移动调试功能试玩)
适当游戏,娱乐中学习。

视频演示效果

代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 谷歌浏览器驱动
from selenium import webdriver

# sleep模块,让程序停止往下运行
from time import sleep

# 操作链
from selenium.webdriver.common.action_chains import ActionChains


# 导入 random(随机数) 模块
import random

# 手机模式加载谷歌浏览器
mobile_emulation = {'deviceName': 'iPhone 5'}
options = webdriver.ChromeOptions()
options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(chrome_options=options)

# 设置浏览器大小
driver.set_window_rect(0,0,700,700)

sleep(1)
# 打开设定的网址
driver.get('https://dushusir.com/xigua')

# 隐式等待
driver.implicitly_wait(5)

while(True):
    
    # 随机取位置
    randomX = random.randint(20,300)
    randomY = random.randint(200,300)

    print('click')
    # 设定点击位置  
    ActionChains(driver).move_by_offset(randomX, randomY).click().perform()

    # move_by_offset会累计上一次的位置,点击完重置
    ActionChains(driver).move_by_offset(-randomX, -randomY).perform()
    sleep(1)

# driver.quit()

更多

后续关注公众号:技术分社,获取最新脚本和小游戏动态