歡迎添加華為云小助手微信(微信號(hào): HWCloud002 ?或? HWCloud003 ),輸入關(guān)鍵字“ 加群 ”,加入華為云線上技術(shù)討論群;輸入關(guān)鍵字“ 最新活動(dòng) ”,獲取華為云最新特惠促銷。華為云諸多技術(shù)大咖、特惠活動(dòng)等你來撩!
?
Python開發(fā)GUI
今天一位從我公眾號(hào)開始結(jié)識(shí)的朋友,詢問關(guān)于如何快速編寫一個(gè)exe工具的問題。由于功能簡單且之前無相關(guān)GUI編程基礎(chǔ),為了快速完成開發(fā),我向他推薦了easygui模塊。
python作為膠水語言,幾乎沒有不能做的事情,但個(gè)人一直覺得在GUI開發(fā)方面python可以算作是短板了,為什么?因?yàn)樾阅堋璸ython的性能問題,往往出現(xiàn)在其他編程語言對(duì)其的鄙夷中。但不管如何python在GUI編程上,也是有大量優(yōu)秀模塊的
tkinter
也許有些人不知道這個(gè)模塊,但如果你安裝python后,使用過自帶的IDLE,那么你就應(yīng)該了解它。tkinter作為python自帶的GUI模塊,IDLE便是通過該模塊開發(fā)的,也是我比較喜歡的一個(gè)模塊
easygui
第一次了解這個(gè)模塊,還是在小甲魚的《零基礎(chǔ)入門學(xué)習(xí)python》時(shí)學(xué)習(xí)的,該模塊對(duì)Tkinter進(jìn)行了二次封裝,是的GUI操作變得更為簡單,但同時(shí)也局限于表層的使用,
wxpython
wxpython是一個(gè)Python包裝wxWidgets(這是用 C++ 編寫),一個(gè)流行的跨平臺(tái)GUI工具包。在wxPython API主要模塊包括一個(gè)核心模塊。
wxpython的優(yōu)勢(shì)在速運(yùn)行速度較快,但編寫起來較為復(fù)雜,而且界面美化效果較差…
PYQT5
Qt是一套跨平臺(tái)的C++庫,不論是C、Java還是Python,都可以通過它來實(shí)現(xiàn)GUI界面的開發(fā)。PyQt5是Qt v5的一套全面的Python綁定。它實(shí)現(xiàn)為超過35個(gè)擴(kuò)展模塊,并使Python能夠在所有支持的平臺(tái)(包括iOS和Android)上用作C ++的替代應(yīng)用程序開發(fā)語言。
如果你對(duì)GUI編程非常感謝興趣,可以用心學(xué)學(xué)這個(gè)模塊,但如果你只是想快速的實(shí)現(xiàn)一些GUI的功能,我更推薦大家學(xué)習(xí)tkinter模塊,為什么?
-
tkinter作為python默認(rèn)自帶的模塊庫,無需單獨(dú)安裝
-
tkinter相比于wxpython與pyqt在針對(duì)小工具的編程方面,更為高效
-
tkinter在網(wǎng)上存在大量的快速入門教程
tkinter實(shí)戰(zhàn)
為了證明tkinter的方便與高效,我將很早前在公司寫的一個(gè)pythonGUI代碼,將圖片轉(zhuǎn)化為素描畫的小工具,晚上重寫了一次,先給大家看看實(shí)現(xiàn)效果:
避坑指南
tktiner添加圖片
大家看到,tktiner中附帶了一個(gè)我的微信二維碼,這里只是為了演示tkinter添加圖片,沒有絲毫推廣的味道,哈哈…這里要注意下,tktiner在添加圖片時(shí),PhotoImage(file=’tmp.gif’)要求圖片必須是.gif結(jié)尾的圖片,否則就會(huì)報(bào)錯(cuò):
_tkinter.TclError: couldn’t recognize data in image file
關(guān)于base64
大家看到我沒有加載圖片,而是通過base64提前轉(zhuǎn)碼好二進(jìn)制文件后,再進(jìn)行導(dǎo)入,這樣我們打包的exe在使用時(shí),就無需附帶一個(gè)圖片文件了!
import base64
with open('demo.gif','rb') as f:
data = f.read()
img = base64.b64encode(data)
? tkinter打包
既然我們開發(fā)的是GUI工具,必須得打包成exe才更好玩啊!但是以往很正常的打包,這次居然報(bào)錯(cuò)了:
找了半天才發(fā)現(xiàn),從python 3.6開始,enum34庫不再與標(biāo)準(zhǔn)庫兼容。該庫也是不必要的,因此只需卸載它即可。
pip uninstall enum34
再次執(zhí)行,大功告成!
總體代碼
最后附上工具的整體代碼,可供大家參考:
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清風(fēng)Python
# @Date : 2019/8/6 01:18
# @Software : PyCharm
# @version :Python 3.7.3
# @File : ChangeImage.py
from tkinter.messagebox import *
from tkinter.filedialog import *
from tkinter import *
import base64
from PIL import Image, ImageFilter, ImageOps
import os
img_bs64 = b'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'
def dodge(a, b, alpha):
return min(int(a * 255 / (256 - b * alpha)), 255)
def draw(dir_info, blur=25, alpha=1.0):
base_dir = os.path.dirname(os.path.abspath(__file__))
save_file_name = os.path.join(base_dir, 'final.png')
img = Image.open(dir_info)
img1 = img.convert('L') # 圖片轉(zhuǎn)換灰色
img2 = img1.copy()
img2 = ImageOps.invert(img2)
for i in range(blur):
img2 = img2.filter(ImageFilter.BLUR)
width, height = img1.size
for x in range(width):
for y in range(height):
a = img1.getpixel((x, y))
b = img2.getpixel((x, y))
img1.putpixel((x, y), dodge(a, b, alpha))
img1.save(save_file_name)
img1.show()
class LoginPage(object):
def __init__(self, master=None):
self.root = master
self.root.geometry('%dx%d' % (420, 240))
self.page = Frame(self.root)
self.Dir = StringVar()
self.Port = StringVar()
self.path = StringVar()
self.dir_info = StringVar()
self.create_page()
def create_page(self):
self.page.grid()
with open('tmp.gif', 'wb+') as f:
f.write(base64.b64decode(img_bs64))
self.photo = PhotoImage(file='tmp.gif')
os.remove('tmp.gif')
Label(self.page, text='''
公眾號(hào): 清風(fēng)Python
作者 : 王翔
時(shí)間 :2019-08-06
工具 :Python 3.7.3 Tkinter
詳情 : 將圖片轉(zhuǎn)化為素描畫''', justify=LEFT).grid(row=0, column=0, columnspan=2, rowspan=1, stick=NW)
Label(self.page, text="圖片路徑").grid(row=3, column=0, sticky=W, pady=5)
self.dir_info = Entry(self.page, textvariable=self.path)
self.dir_info.grid(row=3, column=1, columnspan=1, padx=20)
Button(self.root, text="選擇路徑", command=lambda: self.select_path()).grid(row=0, column=0, sticky=S, padx=20,
pady=5)
Label(self.page, image=self.photo).grid(row=0, column=2)
Button(self.page, text='轉(zhuǎn)換', command=self.login_check, width=10).grid(row=3, column=2, padx=10, pady=5)
def select_path(self):
path_ = askopenfilename(filetypes=[("file", "*.*")])
self.path.set(path_)
def login_check(self):
img_dir = self.dir_info.get()
if img_dir == "":
showinfo(title='錯(cuò)誤', massage='路徑錯(cuò)誤')
else:
draw(img_dir)
root = Tk()
root.title('素描畫轉(zhuǎn)化工具')
LoginPage(root)
root.mainloop()
The End
OK,今天的內(nèi)容就到這里,如果覺得內(nèi)容對(duì)你有所幫助,歡迎點(diǎn)擊文章右下角的“在看”。
公眾號(hào)回復(fù)素描,下載打包好的exe圖片轉(zhuǎn)素描話工具,一起玩玩吧….
期待你關(guān)注我的公眾號(hào)
清風(fēng)Python
,如果覺得不錯(cuò),希望能動(dòng)動(dòng)手指轉(zhuǎn)發(fā)給你身邊的朋友們。
作者:清風(fēng)Python
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
