精华内容
下载资源
问答
  • 使使用用python图形形模模块块turtle库库绘绘制制樱樱花花玫玫瑰瑰圣圣诞诞树树代代码码实实例例 这篇文章主要介绍了用python绘制樱花玫瑰圣诞树代码实例,需要的朋友可以参考下 今天为大家介绍几个Python 逼实例...
  • 今天为大家介绍几个Python“装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库 Python绘制樱花代码实例 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import ...
  • 今天为大家介绍几个Python"装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库Python绘制樱花代码实例动态生成樱花效果图(这个是动态的):实现代码import turtle as Timport random...

    今天为大家介绍几个Python"装逼”实例代码,python绘制樱花、玫瑰、圣诞树代码实例,主要使用了turtle库

    Python绘制樱花代码实例

    动态生成樱花

    效果图(这个是动态的):

    2020316153613501.png?20202684036

    实现代码

    import turtle as T

    import random

    import time

    # 画樱花的躯干(60,t)

    def Tree(branch, t):

    time.sleep(0.0005)

    if branch > 3:

    if 8 <= branch <= 12:

    if random.randint(0, 2) == 0:

    t.color('snow') # 白

    else:

    t.color('lightcoral') # 淡珊瑚色

    t.pensize(branch / 3)

    elif branch < 8:

    if random.randint(0, 1) == 0:

    t.color('snow')

    else:

    t.color('lightcoral') # 淡珊瑚色

    t.pensize(branch / 2)

    else:

    t.color('sienna') # 赭(zhě)色

    t.pensize(branch / 10) # 6

    t.forward(branch)

    a = 1.5 * random.random()

    t.right(20 * a)

    b = 1.5 * random.random()

    Tree(branch - 10 * b, t)

    t.left(40 * a)

    Tree(branch - 10 * b, t)

    t.right(20 * a)

    t.up()

    t.backward(branch)

    t.down()

    # 掉落的花瓣

    def Petal(m, t):

    for i in range(m):

    a = 200 - 400 * random.random()

    b = 10 - 20 * random.random()

    t.up()

    t.forward(b)

    t.left(90)

    t.forward(a)

    t.down()

    t.color('lightcoral') # 淡珊瑚色

    t.circle(1)

    t.up()

    t.backward(a)

    t.right(90)

    t.backward(b)

    # 绘图区域

    t = T.Turtle()

    # 画布大小

    w = T.Screen()

    t.hideturtle() # 隐藏画笔

    t.getscreen().tracer(5, 0)

    w.screensize(bg='wheat') # wheat小麦

    t.left(90)

    t.up()

    t.backward(150)

    t.down()

    t.color('sienna')

    # 画樱花的躯干

    Tree(60, t)

    # 掉落的花瓣

    Petal(200, t)

    w.exitonclick()

    飘落效果

    效果图:

    2020316153625996.png?20202684036

    代码:

    from turtle import *

    from random import *

    from math import *

    def tree(n,l):

    pd()#下笔

    #阴影效果

    t = cos(radians(heading()+45))/8+0.25

    pencolor(t,t,t)

    pensize(n/3)

    forward(l)#画树枝

    if n>0:

    b = random()*15+10 #右分支偏转角度

    c = random()*15+10 #左分支偏转角度

    d = l*(random()*0.25+0.7) #下一个分支的长度

    #右转一定角度,画右分支

    right(b)

    tree(n-1,d)

    #左转一定角度,画左分支

    left(b+c)

    tree(n-1,d)

    #转回来

    right(c)

    else:

    #画叶子

    right(90)

    n=cos(radians(heading()-45))/4+0.5

    pencolor(n,n*0.8,n*0.8)

    circle(3)

    left(90)

    #添加0.3倍的飘落叶子

    if(random()>0.7):

    pu()

    #飘落

    t = heading()

    an = -40 +random()*40

    setheading(an)

    dis = int(800*random()*0.5 + 400*random()*0.3 + 200*random()*0.2)

    forward(dis)

    setheading(t)

    #画叶子

    pd()

    right(90)

    n = cos(radians(heading()-45))/4+0.5

    pencolor(n*0.5+0.5,0.4+n*0.4,0.4+n*0.4)

    circle(2)

    left(90)

    pu()

    #返回

    t=heading()

    setheading(an)

    backward(dis)

    setheading(t)

    pu()

    backward(l)#退回

    bgcolor(0.5,0.5,0.5)#背景色

    ht()#隐藏turtle

    speed(0)#速度 1-10渐进,0 最快

    tracer(0,0)

    pu()#抬笔

    backward(100)

    left(90)#左转90度

    pu()#抬笔

    backward(300)#后退300

    tree(12,100)#递归7层

    done()

    暗色效果

    效果:

    2020316153629931.png?20202684036

    代码

    from turtle import *

    from random import *

    from math import *

    def tree(n, l):

    pd()

    t = cos(radians(heading() + 45)) / 8 + 0.25

    pencolor(t, t, t)

    pensize(n / 4)

    forward(l)

    if n > 0:

    b = random() * 15 + 10

    c = random() * 15 + 10

    d = l * (random() * 0.35 + 0.6)

    right(b)

    tree(n - 1, d)

    left(b + c)

    tree(n - 1, d)

    right(c)

    else:

    right(90)

    n = cos(radians(heading() - 45)) / 4 + 0.5

    pencolor(n, n, n)

    circle(2)

    left(90)

    pu()

    backward(l)

    bgcolor(0.5, 0.5, 0.5)

    ht()

    speed(0)

    tracer(0, 0)

    left(90)

    pu()

    backward(300)

    tree(13, 100)

    done()

    Python绘制玫瑰花代码实例

    效果(有绘制过程)

    2020316153633818.png?20202684036

    代码

    from turtle import *

    import time

    setup(1000,800,0,0)

    speed(0)

    penup()

    seth(90)

    fd(340)

    seth(0)

    pendown()

    speed(5)

    begin_fill()

    fillcolor('red')

    circle(50,30)

    for i in range(10):

    fd(1)

    left(10)

    circle(40,40)

    for i in range(6):

    fd(1)

    left(3)

    circle(80,40)

    for i in range(20):

    fd(0.5)

    left(5)

    circle(80,45)

    for i in range(10):

    fd(2)

    left(1)

    circle(80,25)

    for i in range(20):

    fd(1)

    left(4)

    circle(50,50)

    time.sleep(0.1)

    circle(120,55)

    speed(0)

    seth(-90)

    fd(70)

    right(150)

    fd(20)

    left(140)

    circle(140,90)

    left(30)

    circle(160,100)

    left(130)

    fd(25)

    penup()

    right(150)

    circle(40,80)

    pendown()

    left(115)

    fd(60)

    penup()

    left(180)

    fd(60)

    pendown()

    end_fill()

    right(120)

    circle(-50,50)

    circle(-20,90)

    speed(1)

    fd(75)

    speed(0)

    circle(90,110)

    penup()

    left(162)

    fd(185)

    left(170)

    pendown()

    circle(200,10)

    circle(100,40)

    circle(-52,115)

    left(20)

    circle(100,20)

    circle(300,20)

    speed(1)

    fd(250)

    penup()

    speed(0)

    left(180)

    fd(250)

    circle(-300,7)

    right(80)

    circle(200,5)

    pendown()

    left(60)

    begin_fill()

    fillcolor('green')

    circle(-80,100)

    right(90)

    fd(10)

    left(20)

    circle(-63,127)

    end_fill()

    penup()

    left(50)

    fd(20)

    left(180)

    pendown()

    circle(200,25)

    penup()

    right(150)

    fd(180)

    right(40)

    pendown()

    begin_fill()

    fillcolor('green')

    circle(-100,80)

    right(150)

    fd(10)

    left(60)

    circle(-80,98)

    end_fill()

    penup()

    left(60)

    fd(13)

    left(180)

    pendown()

    speed(1)

    circle(-200,23)

    exitonclick()

    Python绘制圣诞树代码实例

    圣诞树 (动态生成效果)

    2020316153641805.png?20202684036

    代码:

    from turtle import *

    import random

    import time

    n = 100.0

    speed("fastest")

    screensize(bg='seashell')

    left(90)

    forward(3*n)

    color("orange", "yellow")

    begin_fill()

    left(126)

    for i in range(5):

    forward(n/5)

    right(144)

    forward(n/5)

    left(72)

    end_fill()

    right(126)

    color("dark green")

    backward(n*4.8)

    def tree(d, s):

    if d <= 0: return

    forward(s)

    tree(d-1, s*.8)

    right(120)

    tree(d-3, s*.5)

    right(120)

    tree(d-3, s*.5)

    right(120)

    backward(s)

    tree(15, n)

    backward(n/2)

    for i in range(200):

    a = 200 - 400 * random.random()

    b = 10 - 20 * random.random()

    up()

    forward(b)

    left(90)

    forward(a)

    down()

    if random.randint(0, 1) == 0:

    color('tomato')

    else:

    color('wheat')

    circle(2)

    up()

    backward(a)

    right(90)

    backward(b)

    time.sleep(60)

    本文主要介绍了Python使用turtle库绘制樱花、玫瑰、圣诞树代码实例,更多关于Python图像模块turtle库的使用方法请查看下面的相关链接

    展开全文
  • title: Python图形模块EasyGUI中文文档 date: 2020-03-23 09:15:02 tags: [python,图形化,easygui ] categories: [笔记,开发文档 ] 说明 在EasyGUI中,所有的GUI交互都由简单函数调用这是一个使用EasyGUI的简单...

    说明

    在EasyGUI中,所有的GUI交互都由简单函数调用
    这是一个使用EasyGUI的简单演示程序。

    from easygui import *
    import sys
    
    # A nice welcome message
    ret_val = msgbox("Hello, World!")
    if ret_val is None: # User closed msgbox
        sys.exit(0)
    
    msg ="What is your favorite flavor?\nOr Press <cancel> to exit."
    title = "Ice Cream Survey"
    choices = ["Vanilla", "Chocolate", "Strawberry", "Rocky Road"]
    while 1:
        choice = choicebox(msg, title, choices)
        if choice is None:
            sys.exit(0)
        msgbox("You chose: {}".format(choice), "Survey Result")
    
    

    EasyGUI演示程序

    要运行EasyGUI的演示程序,从命令行调用EasyGUI:

    python easygui.py
    

    或者从IDE(如 IDLE, PythonWin, Wing等)这样:

    from easygui import *
    egdemo()
    

    这样就可以使用EasyGUI的各个函数,并将你的选择输出到控制台中。

    导入EasyGUI

    • 为了使用EasyGUI,必须在使用前导入本模块。最简单的导入语句是:
    import easygui
    

    如果使用该表单,则需要访问EasyGUI的函数,必须使用"EasyGUI"前缀,示例:

    easygui.msgbox(...)
    
    • 第二种是以这种方式导入EasyGUI:
    from easygui import *
    

    这使得调用EasyGUI函数更容易;您不必用"EasyGUI"来对函数名进行前缀,此时你就可以这样写:

    msgbox(...)
    
    • 第三种是使用如下导入语句:
    import easygui as g
    

    这样你就可以使用较少的单词(g)替代原单词(easygui),此时你可以这样写:

    g.msgbox(...)
    

    若你习惯使用Python和EasyGUI,则第三种替代方法实际上是最好的方法。

    使用EasyGUI

    当您已经导入EasyGUI模块后,GUI操作就可以简单的用EasyGUI函数添加几个参数实现了。例如,使用EasyGUI写一个简单的"Hello,World!"程序:

    from easygui import *
    msgbox("Hello, world!")
    

    若要查看调用EasyGUI运行结果,在命令提示符窗口输入:

    python easygui.py
    

    若要查看调用EasyGUI函数的代码示例,请查看EasyGUI.py末尾的演示代码。

    EasyGUI函数的缺省参数

    对于所有的图形化组件函数,前两个参数是消息(msg)和标题(title),按顺序排列。在某些情况下,对用户来说这可能不是最为友好的安排(例如,获取目录和文件名的对话框忽略消息(msg)参数),但我认为更重要的是保持所有组件之间的一致性。

    大多数EasyGUI函数的参数都有缺省值。几乎所有的图形化组件函数都显示一个消息和一个标题。标题默认为空字符串,并且消息通常具有简单的默认值。

    这样可以根据需要,指定尽可能少的参数,以获得所需的结果。例如,msgbox函数的标题参数是可选的,所以你可以只指定消息调用msgbox函数,这样:

    msgbox("Danger, Will Robinson!")
    

    或者指定消息和标题,这样:

    msgbox("Danger, Will Robinson!", "Warning!")
    

    在各种类型的buttonbox上,默认的消息是"Shall I continue?",所以,你可以无需任何参数去调用buttonbox函数。这里,我们可以无需任何参数调用ccbox函数(close/cancel box,它返回布尔值):

    if ccbox():
        pass	# 用户选择后继续
    else:
        return	#用户选择后退出
    

    在调用EasyGUI函数时使用关键字参数

    在调用EasyGUI函数时可能会使用到关键字参数。

    假设你想使用一个ButoBox,但是(不管什么原因)不想指定标题(第二)位置的参数。您仍然可以使用关键字指定选择参数(第三个参数),这样:

    choices = ["是","否","只在周五"]
    reply = choicebox("你喜欢吃鱼吗?", choices=choices)
    

    使用按钮控件(buttonboxes)

    为满足公共需求在文件顶部建立buttonbox()的函数。

    提示框

    msgbox显示一条消息并提供一个OK按钮。你可以发送任何你想要的消息,以及你想要的任何标题。如果你愿意,你也可以在按钮上重写“OK”的默认文本。下面是msgbox函数的示例:

    def msgbox(msg="(Your message goes here)", title="", ok_button="OK"):
        ....
    

    重写按钮文本最简单的方法是用关键字参数,示例:

    msgbox("Backup complete!", ok_button="Good job!")
    

    下面是几个示例:

    msgbox("Hello, world!")
    

    msgbox("Hello, world!")

    msg = "Do you want to continue?"
    title = "Please Confirm"
    if ccbox(msg, title):     # show a Continue/Cancel dialog
        pass  # user chose Continue
    else:  # user chose Cancel
        sys.exit(0)
    

    Do you want to continue?

    ccbox

    ccbox提供"继续"和"取消"选项,并返回 True(用于继续)或返回 False(用于取消)。

    ynbox

    ynbox提供了"是"和"否"的选择,并返回false的true。

    buttonbox

    若要在buttonbox中指定自己的按钮集,请使用buttonbox()函数。

    buttonbox可以用来显示你选择的一组按钮。当用户单击按钮时,buttonbox()返回选择的文本。如果用户取消或关闭buttonbox,则返回默认选择(第一选择)。

    按钮框显示一个消息、一个标题和一组按钮。返回值为用户选择的按钮的文本。

    indexbox

    indexbox显示一个消息、一个标题和一组按钮。返回用户选择的索引。例如,如果使用三个选项(A,B,C)调用索引框,如果用户选择A,则索引框将返回0,如果他选择B,则返回1,如果选择C,则为2。

    boolbox

    boolbox(boolean box)显示一个消息、一个标题和一组按钮。如果选择第一个按钮,返回1。否则返回0。
    下面是boolbox()的一个简单例子:

    message = "What does she say?"
    title = ""
    if boolbox(message, title, ["She loves me", "She loves me not"]):
        sendher("Flowers") # This is just a sample function that you might write.
    else:
        pass
    

    如何在buttonbox中显示图像

    当调用Button框函数时(或显示按钮的其他函数,如msgbox、indexbox、ynbox等等),您可以指定关键字参数image=xxx,其中xxx是图像的文件名,文件可以是.gif。

    你也可以使用其他图像格式,如.png。

    如果指定了图像参数,则图像文件将在消息之后显示。

    以下是EasyGUI示例代码:

    image = "python_and_check_logo.gif"
    msg = "Do you like this picture?"
    choices = ["Yes","No","No opinion"]
    reply = buttonbox(msg, image=image, choices=choices)
    

    如果点击底部的一个按钮,它的值将在“reply”中返回。你也可以点击图像,返回图像文件名。

    buttonbox中显示图像

    让用户从选择列表中选择

    choicebox

    Buttonboxes很好地为用户提供了短选择的小选择。但是如果有很多选择,或者选择的文本很长,那么一个更好的策略就是把它们呈现为一个列表。

    choicebox提供了一种用户从选择列表中选择的方法。选择是按序列(元组或列表)指定的。在呈现之前,将给出不区分大小写的选项。

    键盘可以用来选择列表中的元素。

    例如,在键盘上按下"g",将跳转到"g"开头单词的第一个元素,再次按下"g",光标会跳转到下一个元素。在从"g"开始的元素的末尾,再次按下"g"将使选择包括所有"g"开头的元素,并跳到"g"开头第一个元素。

    如果没有从"g"开始的元素,则选择发生在"g"位置之前的最后一个元素。如果在"g"之前没有元素,则选择列表中的第一个元素:

    msg ="What is your favorite flavor?"
    title = "Ice Cream Survey"
    choices = ["Vanilla", "Chocolate", "Strawberry", "Rocky Road"]
    choice = choicebox(msg, title, choices)
    

    choicebox

    choicebox的另一个例子:

    choicebox的另一个例子

    multchoicebox

    multchoicebox()函数为用户从选择列表中选择了一种方式。界面看起来像choicebox,但是用户可以有0个、1个或多个选择。

    选项是按序列(元组或列表)指定的。在输出之前,选项将按不区分大小写的顺序排列。

    multchoicebox

    让用户输入信息

    enterbox

    enterbox是从用户那里获取字符串的最简单的方法

    integerbox

    integerbox是从用户那里获取整数的最简单的方法

    multenterbox

    multenterbox是显示多个enterbox在一个屏幕上的最简单的方法

    multenterbox

    在multenterbox中:

    • 如果值比名称少,则在值的数目与名称的数目相同的情况下,用空字符串填充值列表。
    • 如果有更多的值而不是名称,则将列表的值截断,以便有与名称一样多的值。

    返回字段值的列表,若用户取消操作,则无返回值。

    下面是一些示例代码,它显示了multenterbox返回的值如何在被接受之前检查其有效性:

    from __future__ import print_function
    msg = "Enter your personal information"
    title = "Credit Card Application"
    fieldNames = ["Name", "Street Address", "City", "State", "ZipCode"]
    fieldValues = multenterbox(msg, title, fieldNames)
    if fieldValues is None:
        sys.exit(0)
    # make sure that none of the fields were left blank
    while 1:
        errmsg = ""
        for i, name in enumerate(fieldNames):
            if fieldValues[i].strip() == "":
              errmsg += "{} is a required field.\n\n".format(name)
        if errmsg == "":
            break # no problems found
        fieldValues = multenterbox(errmsg, title, fieldNames, fieldValues)
        if fieldValues is None:
            break
    print("Reply was:{}".format(fieldValues))
    

    让用户输入密码信息

    passwordbox

    passwordbox就像一个enterbox,但用于输入密码。在键入文本时,文本被屏蔽为星号。

    multpasswordbox

    multpasswordbox具有与multenterbox相同的接口,但当显示时,最后一个字段被假定为密码,并用星号屏蔽。

    multpasswordbox

    显示文本

    EasyGUI提供了显示文本的功能。

    textbox

    textbox()函数以比例字体显示文本。正文将文字换行。

    codebox

    codebox()函数以一个单字符的字体显示文本,不进行格式处理。

    codebox

    注意,可以通过字符串或字符串列表传递codebox()和textbox()。字符串列表将在显示之前转换为文本。你可以使用这些函数显示文件的内容:

    import os
    filename = os.path.normcase("c:/autoexec.bat")
    f = open(filename, "r")
    text = f.readlines()
    f.close()
    codebox("Contents of file " + filename, "Show File Contents", text)
    

    使用文件

    常见的需求是向用户请求文件名或目录。EasyGUI提供了允许用户浏览文件系统并选择目录或文件的基本功能(这些函数是关于lib-tk中的小部件和类的包装)。

    请注意,在当前版本的EasyGUI中,不支持startpos参数。

    diropenbox

    diropenbox返回目录的名称

    fileopenbox

    fileopenbox返回打开文件的名称

    fileopenbox

    filesavebox

    filesavebox返回文件名

    记住用户设置

    EgStore

    用户请求一些设置,然后保存或者将其存储在磁盘上,这样,下次用户使用你的应用程序时,就可以记住他以前的设置。

    为了实现存储和恢复用户设置的过程,EasyGUI提供了一个名为EgStore的类。为了记住一些设置,您的应用程序必须定义一个继承EgStore的类(我们称之为设置,你可以改为"啥都无所谓")。

    您的应用程序还必须创建该类的对象(让我们调用设置对象)

    设置类的构造函数(the__init__method)可以初始化所有你设置的值。

    完成此操作后,你就可以简单地通过将值赋值给设置对象中的实例变量来记住设置,并使用settings.store()方法将设置参数保存到磁盘。

    下面是使用设置类的代码示例:

    from easygui import EgStore
    
    # -----------------------------------------------------------------------
    # define a class named Settings as a subclass of EgStore
    # -----------------------------------------------------------------------
    class Settings(EgStore):
    
        def __init__(self, filename):  # filename is required
            # -------------------------------------------------
            # Specify default/initial values for variables that
            # this particular application wants to remember.
            # -------------------------------------------------
            self.userId = ""
            self.targetServer = ""
    
            # -------------------------------------------------
            # For subclasses of EgStore, these must be
            # the last two statements in  __init__
            # -------------------------------------------------
            self.filename = filename  # this is required
            self.restore()
    
    # Create the settings object.
    # If the settingsFile exists, this will restore its values
    # from the settingsFile.
    # create "settings", a persistent Settings object
    # Note that the "filename" argument is required.
    # The directory for the persistent file must already exist.
    
    settingsFilename = "settings.txt"
    settings = Settings(settingsFilename)
    
    # Now use the settings object.
    # Initialize the "user" and "server" variables
    # In a real application, we'd probably have the user enter them via enterbox
    user    = "obama_barak"
    server  = "whitehouse1"
    
    # Save the variables as attributes of the "settings" object
    settings.userId = user
    settings.targetServer = server
    settings.store()    # persist the settings
    print("\nInitial settings")
    print settings
    
    # Run code that gets a new value for userId
    # then persist the settings with the new value
    user    = "biden_joe"
    settings.userId = user
    settings.store()
    print("\nSettings after modification")
    print settings
    
    # Delete setting variable
    del settings.userId
    print("\nSettings after deletion of userId")
    print settings
    

    下面是使用专用函数创建设置类的代码示例:

    from easygui import read_or_create_settings
    
    # Create the settings object.
    settings = read_or_create_settings('settings1.txt')
    
    # Save the variables as attributes of the "settings" object
    settings.userId = "obama_barak"
    settings.targetServer = "whitehouse1"
    settings.store()    # persist the settings
    print("\nInitial settings")
    print settings
    
    # Run code that gets a new value for userId
    # then persist the settings with the new value
    user    = "biden_joe"
    settings.userId = user
    settings.store()
    print("\nSettings after modification")
    print settings
    
    # Delete setting variable
    del settings.userId
    print("\nSettings after deletion of userId")
    print settings
    

    捕获异常(抛出异常)

    ##exceptionbox

    在EasyGui应用程序中有时会出现异常情况。根据应用程序的运行方式,堆栈跟踪可能会被丢弃,或者在应用程序崩溃时输出异常信息。

    EasyGUI提供了一种通过exceptionbox处理异常的方法。exceptionbox显示代码框中的堆栈跟踪,并允许继续处理。

    exceptionbox使用简单。下面是一个代码示例:

    try:
        someFunction()  # this may raise an exception
    except:
        exceptionbox()
    

    exceptionbox


    # 翻译自英文版原文档 许继续处理。

    exceptionbox使用简单。下面是一个代码示例:

    try:
        someFunction()  # this may raise an exception
    except:
        exceptionbox()
    

    [外链图片转存中…(img-R3uHhGmU-1585019852598)]


    翻译自英文版原文档

    原版文档地址:https://easygui.readthedocs.io/en/latest/tutorial.html

    展开全文
  • ocr图片识别通常可以利用tesserocr模块,将图片中内容识别出来并转换为text并输出 Tesserocr是python的一个OCR识别库,是对tesseract做的一层python APT封装。在安装Tesserocr前,需要先安装tesseract tessrtact...

    ocr图片识别通常可以利用tesserocr模块,将图片中内容识别出来并转换为text并输出

    Tesserocr是python的一个OCR识别库,是对tesseract做的一层python APT封装。在安装Tesserocr前,需要先安装tesseract

    tessrtact文件:

    https://digi.bib.uni-mannheim.de/tesseract/

    python安装tessocr: 下载对应的.whl文件安装(这个包pip方式容易出错)

    tesseract 与对应的tesserocr:

    https://github.com/simonflueckiger/tesserocr-windows_build/releases

    实现代码如下:

    from PIL import Image

    import tesserocr

    #tesserocr识别图片的2种方法 

    img = Image.open("code.jpg")

    verify_code1 = tesserocr.image_to_text(img)

    #print(verify_code1)

    verify_code2 = tesserocr.file_to_text("code.jpg")

    #print(verify_code2)

    但是,当图片中干扰部分较多,如验证码内多余的线条干扰图片的识别,识别后的内容不是很准确,就需要做一下处理,如转灰度,二值化操作。

    可以利用Image对象的convert()方法,传入“L”,将图片转为灰度图像;传入1则对图像进行二值处理(默认阈值127)

    原验证码:

    img = Image.open("code.jpg")

    img_L = img.convert("L")

    img_L.show()

    也可以自己设置阈值

    threshold = 100   #设置二值的阈值100

    table = []

    for i in range(256):

        if i < threshold:

            table.append(0)

        else:

            table.append(1)

     

    #point()返回给定查找表对应的图像像素值的拷贝,变量table为图像的每个通道设置256个值,为输出图像指定一个新的模式,模式为“L”和“P”的图像进一步转换为模式为“1”的图像

    image = img_L.point(table, "1")

    image.show()

    img_1 = tesserocr.image_to_text(image)

    print(img_1)

    >>5SA6

    操作系统:Win10 1709  X64

    python版本:3.6.5

    依赖模块:PIL、tesserocr。

      需要说明的是,在windows系统上PowerShell通过PIP3 install tesserocr安装验证码识别模块时,需要先安装Tesseract一款由HP实验室开发由Google维护的开源OCR(Optical Character Recognition , 光学字符识别)引擎,与Microsoft Office Document Imaging(MODI)相比,我们可以不断的训练的库,使图像转换文本的能力不断增强。)可执行文件。

      以中国知网的注册页面为例,我们常被要求输入这类简单的字母组成,背景含很多杂线的验证码,如下图所示:

    我们对验证码另存为到本地代码所在目录,取名:test.png.

    下图是直接用对应模块识别的代码示例:

    1

    2

    3

    4

    5

    6

    import tesserocr

    from PIL import Image

    image=Image.open('test.png')

     

    image.show()  #可以打印出图片,供预览

    print(tesserocr.image_to_text(image))

      

      原始图片尺寸较小,极少情况下如果无法正常识别,可以借助图片处理工具PIL模块进行图片等比例放大后保存。此例中直接运行上述代码,结果为“VHIHI”,即使是肉眼可见较为清晰的验证码,如果图片未经处理直接交由tesserocr解析,也可能识别率很低。

      通常情况下,我们还需要做些额外的图片处理,如转灰度图,二值化等。

    利用Image对应的convert()方法传参L,即可将图片转为灰度图。

    image=image.convert('L')

    image.show()

    传入1即可完成二值化,如下:

    image=image.convert('1')

    image.show()

    当然我们更多时候需要根据图片的实际情况指定二值化的阈值,比如我们将阈值设定为80,先转灰度图,再二值化,代码如下:

    import tesserocr
    from PIL import Image
    image=Image.open('test.png')
    image=image.convert("L")
    threshold=80
    table=[]
    for i in range(256):
        if i <threshold:
            table.append(0)
        else:
            table.append(1)
    image=image.point(table,'1')
    image.show()
    print(tesserocr.image_to_text(image))

    观察到处理后图片如右:

      尽管图片已经转为灰度图,且过滤了大部分杂线,但是图片关键像素丢失严重,识别结果自然也不尽如人意,结果:“VH.”。

    此时我们根据图片的实际情况,人为调整程序中预设的阈值到130,再观察:,这次的图片转换效果显著,我们再次查看识别结果,“VHRU”,与肉眼观察到的别无二致,合乎要求。

    可见验证码的识别除了用好识别模块,还需要在必要时引入PIL(图片处理模块)进行图片预处理,预处理过程中的阈值等设定也存有技巧,不同的参数设定,会完全影响最终的识别率。

      现实中很多网站的验证码要远比例子中的来得复杂,尤其是12306购票网站的验证码,使行为验证码开始高速发展,肉眼分辨起来都异常困难,这就要求我们对验证码的识别技术要不断提升,才能突破网站逐步升级的反爬虫机制。

    展开全文
  • 众所周知,在Python中创建图形界面程序有很多种的选择,其中PyQt和wxPython都是很热门的模块包,这些第三方的图形界面模块功能强大、配置丰富,界面美观,是很多人的选择。 州的先生也经常使用PyQt5来为Python程序写...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,818
精华内容 1,127
关键字:

python图形模块

python 订阅