爬蟲+Tkinter綜合練習——個性簽名設計器

python版本:3.6
需手動安裝python庫列表:

  • requests
  • pillow(注意:項目中的PIL庫的安裝並不是pil,而應該是pillow)

瀏覽器:火狐瀏覽器

 

完成效果:

項目分析:

  • 設計界面
  • 獲取設計簽名圖片
  • 下載圖片並顯示

一、設計界面

from tkinter import *
from tkinter import messagebox
from tkinter import ttk        # 注意:下拉列表在ttk中
from PIL import ImageTk

window = Tk()        # 創建窗體

window.geometry('535x345')                # 設置窗體大小
# 關於爲什麼窗體是這個大小的問題,本人寬度是參照生成圖片的寬度的,高度就自己測了
window.resizable(0,0)                     # 設置固定窗體尺寸
window.title('個性簽名設計器')              # 設置窗體名稱
window.iconbitmap('./image/icon.ico')     # 設置窗體圖標

Label(window,text='姓名:',font=('華文行楷',20)).place(x=20,y=20)
name_entry = Entry(window,font=('華文行楷',20))
name_entry.place(x=120,y=20)
Label(window,text='字體:',font=('華文行楷',20)).place(x=20,y=80)
font_box = ttk.Combobox(window,width=10,height=1,font=('華文行楷',20))
font_box.place(x=120,y=80)
# 通過設置下拉列表的'value'屬性可以添加選項
font_box['value'] = ('個性籤','連筆籤','瀟灑籤','草體籤','合文籤','商務籤','可愛籤')
font_box.current(0)    # 下拉列表默認項下標

def get_image():
    name = name_entry.get()
    print(name)

Button(window,width=10,height=3,text='生成簽名',font=('華文行楷',20),command=get_image).place(x=380,y=20)

bm = ImageTk.PhotoImage(file='./image/空白.gif')    # 讀入圖片
# 可以先到網站下載一張空白的圖片佔位,這樣生成之後不會顯得很突兀
label_image = Label(window,image = bm)
label_image.bm = bm
label_image.place(x=0,y=140)

window.mainloop()

如果有相關Tkinter控件參數不瞭解的,可自行百度,或者參考本人寫的相關Tk的文章,相信講的已經非常清楚了,如還有疑問,請在下面留言!!!

二、獲取設計簽名圖片

思路分析:

  • 獲取請求網址地址:http://www.uustv.com/
  • 提交的信息:
            名字
            字體
            ……
  • 獲取生成圖片地址

網站分析:

網站初始界面
網站初始界面
  1. 按快捷鍵“Ctrl+Shfit+E”,彈出網絡窗口,這樣我們就可以看見網頁的請求信息,然後再作分析;
  2. 填好信息,發送請求,我們翻到第一個,點擊它,就可以看到請求信息了

    通過這個信息我們可以知道如下信息:
            請求網址:http://www.uustv.com/
            請求方法:POST
  3. 點擊右邊的選項卡“參數”,查看提交的參數信息

    從中我們可以知道,我們提交了四個數據:
            關鍵字(名字):蘋果
            字體大小:60
            字體:jfcs.ttf
            字體顏色:#00000000
  4. 右擊生成的圖片,點擊“審查元素”,查找生成圖片的地址

代碼分析:

import requests
import re

# 設置請求參數
data = {
    "word": '蘋果',
    "sizes": "60",
    "fonts": 'jfcs.ttf',
    "fontcolor": "#000000"
}

url = 'http://www.uustv.com/'        # 設置請求網址
result = requests.post(url,data)     # 發送請求,獲取返回信息
result.encoding = 'utf-8'            # 設置編碼格式
# 注意:如果不設置編碼格式,有可能會亂碼,網頁編碼格式可以通過源碼的“charset”屬性獲得,搜索一下即可
html = result.text                   # 獲取返回源碼

reg = f'<div class="tu"><img src="(.*?)"/></div>'    # 設置正則表達式檢索規則
img_path = re.findall(reg,html)                      # 根據檢索規則搜索源碼,提取圖片地址
img_adress = url + img_path[0]                       # 補全圖片地址
image = requests.get(img_adress).content             # 獲取圖片內容

# 將獲取到的二進制信息寫入文件並保存
with open('蘋果.gif','wb') as f:
    f.write(image)

三、完整代碼

from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from PIL import ImageTk
import requests
import re

window = Tk()

window.geometry('535x345')
window.resizable(0,0)
window.title('個性簽名設計器')
window.iconbitmap('./image/icon.ico')

Label(window,text='姓名:',font=('華文行楷',20)).place(x=20,y=20)
name_entry = Entry(window,font=('華文行楷',20))
name_entry.place(x=120,y=20)
Label(window,text='字體:',font=('華文行楷',20)).place(x=20,y=80)
font_box = ttk.Combobox(window,width=10,height=1,font=('華文行楷',20))
font_box.place(x=120,y=80)
font_box['value'] = ('個性籤','連筆籤','瀟灑籤','草體籤','合文籤','商務籤','可愛籤')
font_box.current(0)
font =  {
            '個性籤':'jfcs.ttf',
            '連筆籤':'qmt.ttf',
            '瀟灑籤':'bzcs.ttf',
            '草體籤':'lfc.ttf',
            '合文籤':'haku.ttf',
            '商務籤':'zql.ttf',
            '可愛籤':'yqk.ttf'
        }

def get_image():
    name = name_entry.get()
    name = name.strip()
    if name == '':
        messagebox.showwarning('警告',message='請輸入你的姓名')
    else:
        fonts = font[font_box.get()]

        data = {
            "word": name,
            "sizes": "60",
            "fonts": fonts,
            "fontcolor": "#000000"
        }

        url = 'http://www.uustv.com/'
        result = requests.post(url,data)
        result.encoding = 'utf-8'
        html = result.text

        reg = f'<div class="tu"><img src="(.*?)"/></div>'
        img_path = re.findall(reg,html)
        img_adress = url + img_path[0]
        image = requests.get(img_adress).content

        with open('{}.gif'.format(name),'wb') as f:
            f.write(image)

        bm = ImageTk.PhotoImage(file='{}.gif'.format(name))
        label_image = Label(window,image = bm)
        label_image.bm = bm
        label_image.place(x=0,y=140)

Button(window,width=10,height=3,text='生成簽名',font=('華文行楷',20),command=get_image).place(x=380,y=20)

bm = ImageTk.PhotoImage(file='./image/空白.gif')
label_image = Label(window,image = bm)
label_image.bm = bm
label_image.place(x=0,y=140)

window.mainloop()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章