波大大12138 发表于 2020-7-2 10:43:15

关于下载一只猫的代码

import easygui as g
import urllib.request

def main():
    msg = "请填写喵的尺寸"
    title = "下载一只喵"
    fieldNames = ["宽:", "高:"]
    fieldValues = []
    size = width, height = 400, 600
    fieldValues = g.multenterbox(msg, title, fieldNames, size)

    while 1:
      if fieldValues == None:
            break
      errmsg = ""

      try:
            width = int(fieldValues.strip())
      except:
            errmsg += "宽度必须为整数!"

      try:
            height = int(fieldValues.strip())
      except:
            errmsg += "高度必须为整数!"   

      if errmsg == "":
            break
      
      fieldValues = g.multenterbox(errmsg, title, fieldNames, fieldValues)

    url = "http://placekitten.com/g/%d/%d" % (width, height)

    response = urllib.request.urlopen(url)
    cat_img = response.read()

    filepath = g.diropenbox("请选择存放喵的文件夹")

    if filepath:
      filename = '%s/cat_%d_%d.jpg' % (filepath, width, height)
    else:
      filename = 'cat_%d_%d.jpg' % (width, height)

    with open(filename, 'wb') as f:
      f.write(cat_img)

if __name__ == "__main__":
    main()
这个代码有些地方看不懂求教:
1.第九行size语句的作用?我单独将前十行运行了一下发现size已经实现了对输入框进行填充数据的,那么size为什么可以直接对fieldvalues的输入框进行填入,size的填入的是两个数据width,height为什么就一定分别对应了前面的fieldnames,他们应该只是两个简单的参数而已啊?fieldvalues和size的区别是什么?
2.第十三行判断fieldvalues是否为空,前面的1-10行代码已经对输入框进行写入了,这里为什么还要判断?第十八行的这个语句是什么意思: width = int(fieldValues.strip())?第30行的errmsg和第10行的msg在显示上有什么作用和区别吗?
3.第39——42行的if语句什么作用?
4.最后的if __name__ == "__main__":
    main()
在这里什么作用?有没有通俗的语句能代替?

Twilight6 发表于 2020-7-2 11:10:28



1.第九行size语句的作用?
我单独将前十行运行了一下发现size已经实现了对输入框进行填充数据的,那么size为什么可以直接对fieldvalues的输入框进行填入,size的填入的是两个数据width,height为什么就一定分别对应了前面的fieldnames,他们应该只是两个简单的参数而已啊?
fieldvalues和size的区别是什么?

这里第9行开始的 size 是设置宽和高的初始值的,你这里设置默认填写入multenterbox组件中所以一运行就有 400,600的值在输入框中

为什么可以填充?因为这里 g.multenterbox(msg, title, fieldNames, size) 他将size 的值在创建组件的时候就已经填入参数中去了

为什么分别对应?是因为 multenterbox 组件是按列表元素顺序拿来对应的,第一个对应 size 的fieldnames的第一个,fieldnames第二个对应 siez 的第二个,用法就是这样记住即可

fieldvalues和size的区别是什么?两个都是普通的变量名,只是一个size赋值的是元组 (400,600),另一个赋值的是easygui 的函数组件 multenterbox

2.第十三行判断fieldvalues是否为空,前面的1-10行代码已经对输入框进行写入了,这里为什么还要判断?
第十八行的这个语句是什么意思: width = int(fieldValues.strip())?
第30行的errmsg和第10行的msg在显示上有什么作用和区别吗?

fieldValues 赋值的是 g.multenterbox 组件,当你选择 Cancle 取消按钮时候就会返回 None,也就是你要退出,不下载了,所以这里判断你如果点了 Cancle 那么就退出循环

第十八行的 strip() 函数是去除字符串前后的空格,否则你获取到输入框内容如果有空格会导致你转为整型时候报错的,为了防止你输入空格和数字配合导致的报错

没区别,这里只是用 errmsg 来充当填写错误的提示字符串而已


3.第39——42行的if语句什么作用?

区别文件名的作用哈,否则如果你不这么做,你下载的喵咪每次都会覆盖你上次爬取的文件,因为文件名相同,会覆盖原先写入的文件~

4.最后的if __name__ == "__main__":
    main()
在这里什么作用?有没有通俗的语句能代替?

先了解下主要的作用吧:

当这个脚本作为主程序运行时候,会运行 if __name__ == "__main__": 下面的代码块

当这个脚本当作模块导入时候,将不调用 if __name__ == "__main__": 下面的代码块

这里的 main() 如果再正常情况下运行,而没有拿去导入模块,可以把这个代码的 if __name__ == "__main__": 去掉无妨




yhhpf 发表于 2020-7-2 11:19:39

multenterbox(msg='Fill in values for the fields.', title=' ', fields=(), values=())
1,multenterbox中fields代码中赋值是["宽:", "高:"],既所对应的是宽和高两个,
而相对应的values赋值的是size,size也对应了默认值(400,600),这样两者就会对应上了;
通过下面代码执行下,你会发现size是元组类型,
>>> size = width, height = 400, 600
>>> size
(400, 600)
>>> width
400
>>> height
600
>>> type(size)
<class 'tuple'>
>>> type(width)
<class 'int'>
>>> type(height)
<class 'int'>

yhhpf 发表于 2020-7-2 11:20:25

大佬神速无敌~~~{:10_324:}

波大大12138 发表于 2020-7-2 13:29:22

Twilight6 发表于 2020-7-2 11:10
这里第9行开始的 size 是设置宽和高的初始值的,你这里设置默认填写入multenterbox组件中所以一运 ...

1.fieldvalues赋值的是g.multemterbox组件这句话怎么理解啊?fieldvalues他是一个列表然后存放的是宽,高后面需要用户输入的设置的值吗?
2.我不理解的是:代码的第八行设置fieldvalues是一个空列表,第十行是将组件的内容包括size设置的初始值都给了fieldvalues,在第13行怎么还有可能是判断其是空的呢

Twilight6 发表于 2020-7-2 13:43:12

波大大12138 发表于 2020-7-2 13:29
1.fieldvalues赋值的是g.multemterbox组件这句话怎么理解啊?fieldvalues他是一个列表然后存放的是宽,高 ...


第一问:

这里的 fieldvalues = [] 是无用、多余的,因为被 fieldValues = g.multenterbox(msg, title, fieldNames, size) 赋值时候重新覆盖了,所以导致你的误解

第二问:

fieldvalues = []被后来的 fieldValues = g.multenterbox(msg, title, fieldNames, size) 所覆盖,而不是空列表哈

fieldValues = g.multenterbox(msg, title, fieldNames, size) 你就理解为 filedValues 是接受 这个函数g.multenterbox的返回值的

当你按 OK 返回的是输入框的内容,按下Cancle 返回的是 None ,将你按下的结果返回给 fieldValues

波大大12138 发表于 2020-7-2 13:43:45

Twilight6 发表于 2020-7-2 11:10
这里第9行开始的 size 是设置宽和高的初始值的,你这里设置默认填写入multenterbox组件中所以一运 ...

我没有真的搞懂fieldvalues在组件中具体的位置和存在价值能举个栗子说的清楚易懂些吗

Twilight6 发表于 2020-7-2 13:45:27

波大大12138 发表于 2020-7-2 13:43
我没有真的搞懂fieldvalues在组件中具体的位置和存在价值能举个栗子说的清楚易懂些吗

上面一楼还是不理解嘛?

波大大12138 发表于 2020-7-2 13:50:04

Twilight6 发表于 2020-7-2 13:45
上面一楼还是不理解嘛?

我们同时发的没注意哈哈‘
’当你按 OK 返回的是输入框的内容这里说的输入框的内容是size设置初始值的地方也是用户需要自行填入高和宽为多少值的那个地方吗?

Twilight6 发表于 2020-7-2 13:51:26

波大大12138 发表于 2020-7-2 13:50
我们同时发的没注意哈哈‘
’当你按 OK 返回的是输入框的内容这里说的输入框的内容是size设置初始值的地 ...

是的而且是以列表形式返回~~{:10_297:}

波大大12138 发表于 2020-7-2 14:17:56

Twilight6 发表于 2020-7-2 13:51
是的而且是以列表形式返回~~

if filepath:
      filename = '%s/cat_%d_%d.jpg' % (filepath, width, height)
    else:
      filename = 'cat_%d_%d.jpg' % (width, height)


这个判断语句的作用还是没看懂。filepath不是用户自动选择的文件保存路径吗?那么iffilepath开始的语句判断的含义我就搞不懂了能将这四条语句的含义说一下嘛?下面语句判断下一个要加路径名一个不加的,没搞懂。还有怎么覆盖的也没在这些语句中看出来

Twilight6 发表于 2020-7-2 15:02:08

波大大12138 发表于 2020-7-2 14:17
这个判断语句的作用还是没看懂。filepath不是用户自动选择的文件保存路径吗?那么iffilepath开始的 ...


filepath = g.diropenbox("请选择存放喵的文件夹") 这个也和之前的哪=那一样 ,就是 filepath 接受 g.diropenbox 方法返回的 路径

当你点击取消的时候g.diropenbox 返回 None 赋值给 filepath ,所以执行else 保存为当前默认的工作目录下

你如果明确选择了路径,那么久返回路径,进入 if 条件进行设置文件名变量,最后设置完成写入文件对象

bravsheng 发表于 2021-8-20 11:13:07

本帖最后由 bravsheng 于 2021-8-20 11:16 编辑

Twilight6 发表于 2020-7-2 11:10
这里第9行开始的 size 是设置宽和高的初始值的,你这里设置默认填写入multenterbox组件中所以一运 ...

“fieldValues 赋值的是 g.multenterbox 组件,当你选择 Cancle 取消按钮时候就会返回 None,也就是你要退出,不下载了,所以这里判断你如果点了 Cancle 那么就退出循环”
感觉这个程序有个小问题:我发现点击 Cancle 或者叉掉,并不能停止下载,还是会下载到一张图片。感觉这样不合用户的本意。
发现跳出循环后,还是会继续下面的代码:爬取图片并保存到文件夹里。

if __name__ == "__main__"那段解释总结的真好!
页: [1]
查看完整版本: 关于下载一只猫的代码