Python GUI | 利用Tkinter制作簽名設(shè)計(jì)軟件!
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
Tkinter 是 Python 中的標(biāo)準(zhǔn) GUI 庫(kù),使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。今天我們打算再用一個(gè)小案例,帶大家加深對(duì) Tkinter 的理解。

Tkinter簡(jiǎn)介
由于Tkinter是Python自帶的標(biāo)準(zhǔn)庫(kù),我們想要使用它的時(shí)候,只需直接導(dǎo)入即可。
from?tkinter?import?*
Tkinter支持的組件有:

對(duì)于簡(jiǎn)單的圖形界面 Tkinter 還是能應(yīng)付自如,不過(guò)相對(duì)于PyQt5做出的界面不夠美觀,相對(duì)于Pysimplegui則顯得代碼太笨重。這兩個(gè)庫(kù)埋個(gè)坑,后面開一篇單獨(dú)介紹。
今天的整體思路就是:先選擇一個(gè)在線簽名網(wǎng)站,找到接口模擬請(qǐng)求,然后將生成的簽名圖片下載到本地,最后顯示在 Tkinter 生成的 GUI 窗口上。
獲取個(gè)性簽名圖
在制作個(gè)性簽名軟件前,第一件事是先找到一個(gè)合適的網(wǎng)站,獲取他們的接口。
為啥說(shuō)要找合適的網(wǎng)站呢?
某搜索引擎 一搜"簽名設(shè)計(jì)",那真的是花里胡哨啊,我的審美被一頓沖擊。“亂花叢中”找了一圈,才挑到一個(gè)稍微正常一點(diǎn)的網(wǎng)站。

網(wǎng)站地址:http://www.yishuzi.com/b/13.htm
F12開發(fā)者模式,選擇 Network。手動(dòng)將配色調(diào)整為#000000黑色,背景調(diào)整為#FFFFFF白色,隨便輸入一個(gè)名字,點(diǎn)擊生成。
非常輕松,就可以找到該網(wǎng)站生成簽名發(fā)送的請(qǐng)求。如下所示:

廢話不多說(shuō),直接上Python!
通過(guò)requests.post()請(qǐng)求該網(wǎng)址,并導(dǎo)入?yún)?shù)。其中最重要的參數(shù)有兩個(gè):id對(duì)應(yīng)的是帶生成名字,id1對(duì)應(yīng)的是藝術(shù)字體。
import?requests
from?urllib.request?import?urlretrieve
url?=?'http://www.yishuzi.com/b/re13.php'
d?=?requests.post(url,?data={'id':?'測(cè)試簽名',?'zhenbi':?'20191123',
?????????????????????????????'id1':?'904',?'id2':?'#FFFFFF',?
?????????????????????????????'id4':?'#000000',?'id6':?'#000000'})
d.content.decode("utf-8")
可以看到,post()返回的是帶有鏈接的字符串。

輕松就可以從返回的字符串中,提取到生成的增長(zhǎng)的個(gè)性簽名圖片。然后用urlretrieve()下載圖片到本地,最后將其封裝為自定義函數(shù)。
def?create_sign(word):
????url?=?'http://www.yishuzi.com/b/re13.php'
????d?=?requests.post(url,?data={'id':?word,?'zhenbi':?'20191123',
?????????????????????????????????'id1':?'904',?'id2':?'#FFFFFF',?'id4':?'#000000',?'id6':?'#000000'})
????myurl?=?d.content.decode("utf-8").split('"')[1]
????urlretrieve(myurl,?word?+?'.png')
后續(xù)在設(shè)計(jì)軟件GUI界面時(shí),直接調(diào)用這個(gè)函數(shù),就可以直接生成個(gè)性簽名了。
設(shè)計(jì)軟件GUI界面
下載簽名圖片函數(shù)create_sign()已經(jīng)創(chuàng)建好,工作實(shí)際就完成了一半。
剩下就是我們?cè)O(shè)計(jì)軟件界面了,不妨先簡(jiǎn)單畫個(gè)草圖。

這里主要要用到:Label(標(biāo)簽控件)、Entry(輸入控件)、 Button(按鈕控件)、Frame(框架控件)以及選擇字體時(shí),需要用到的Combobox(下拉列表框)。
前面的控件都介紹過(guò),具體看這一篇8000字,Tkinter詳細(xì)使用教程!,這里只重點(diǎn)講一下下拉列表框。
下拉列表框
Python 窗體(Tkinter)下拉列表框Combobox。它是在Tkinter模塊下的ttk模塊的一個(gè)部件,產(chǎn)生的效果是一個(gè)下拉列表框,它是GUI當(dāng)中的一個(gè)裝飾(widget)。當(dāng)用戶點(diǎn)擊下拉列表獲取值的時(shí)候是從列表當(dāng)中選取的,那么就會(huì)產(chǎn)生一個(gè)名為<的虛擬事件。
其常見的幾個(gè)參數(shù)有:
| 語(yǔ)法 | 作用 |
|---|---|
| cv = tk.stringVar() | 綁定變量 |
| com = ttk.Combobox(root, textvariable=cv) | 創(chuàng)建下拉框 |
| com.pack() | 放置下拉框 |
| com["value"] = ('文本',文本') | 設(shè)置下拉數(shù)據(jù) |
| com.current(索引) | 設(shè)置默認(rèn)值 |
| demo = com.get() | 變量接受值 |
| com.bind("<>", 函數(shù)名) | 下拉數(shù)據(jù)點(diǎn)擊調(diào)用函數(shù) |
簡(jiǎn)單用一個(gè)小例子幫助大家理解。
import?tkinter
from?tkinter?import?ttk
root?=?tkinter.Tk()
root.geometry("400x200")?
xVariable?=?tkinter.StringVar()???#創(chuàng)建變量
?
com?=?ttk.Combobox(root,?textvariable=xVariable)??#創(chuàng)建下拉菜單
com.pack()?????#將下拉菜單綁定到窗體
com["value"]?=?("選項(xiàng)1",?"選項(xiàng)2",?"選項(xiàng)3",?"選項(xiàng)4")
com.current(0)???#設(shè)定下拉菜單的默認(rèn)值
root.mainloop()
運(yùn)行后,效果如下所示。

這樣我們?cè)偻ㄟ^(guò)com.get(),就可以獲取下拉框中,最后選擇的值了。
設(shè)計(jì)界面
剩下的界面設(shè)計(jì)就簡(jiǎn)單多了,只需要將Label(標(biāo)簽控件)、Entry(輸入控件)、 Button(按鈕控件)、Frame(框架控件)、Combobox(下拉列表框)排列一下。
回想一下前面畫的草圖,開整!

規(guī)定窗口大小為600x400,再設(shè)置窗口的基本屬性。
所有組件都采用place幾何方法,將組件的大小及布局,進(jìn)行合理的規(guī)劃。同時(shí),Button組件也都與其對(duì)應(yīng)的功能函數(shù)create_sign(word),進(jìn)行了鏈接。
部分代碼如下所示,完整代碼見文末。
root?=?Tk()
root.title("簽名設(shè)計(jì) by:快學(xué)Python")
root.geometry("600x400")
bg_image?=?PhotoImage(file?=?'background.png')
bg_label?=?Label(root,?image?=?bg_image)
bg_label.place(relwidth?=?1,?relheight?=?1)
frame?=?Frame(root,?bg?=?'#edcc79',?bd?=?5)
frame.place(relx?=?0.5,?rely?=?0.1,?relwidth?=?0.75,?relheight?=?0.1,anchor?=?'n')
font_label?=?Label(frame,?text?=?'輸入簽名:',?font?=?('微軟雅黑',?16),?fg?='black')
font_label.place(relwidth?=?0.25,?relheight?=?1)
name_entry?=?Entry(frame,?font?=?('微軟雅黑',?16))
最終成品,展示一下。

輸入名字,點(diǎn)擊生成,一氣呵成!不同風(fēng)格,一鍵轉(zhuǎn)換!這樣,我們就又完成了一個(gè)Tkinter實(shí)戰(zhàn)小案例。
人生苦短,快學(xué)Python,我們明天見!
????小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過(guò)程中,有遇到任何問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
????本文僅僅做代碼學(xué)習(xí)交流分享,大家切勿爬蟲成疾!
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
