這可能是最好玩的python GUI入門實例!

image.png

簡單的說,GUI編程就是給程序加上圖形化界面.

python的腳本開發(fā)簡單,有時候只需幾行代碼就能實現(xiàn)豐富的功能,而且python本身是跨平臺的,所以深受程序員的喜愛.

如果給程序加一個圖形化界面,那么普通的用戶也就能用上python的腳本,極大提升工作效率,所以給python程序加上圖形化界面,把自己寫的腳本,提供給普通用戶,的確是一件激動人心的事!


如何給python腳本加圖形化界面?

作者首先考慮了通過瀏覽器運行python的圖形化界面,為了理想的效果,python需要借助javascript實現(xiàn)一些功能,而且python需要額外安裝pyv8模塊,我折騰了一下,發(fā)現(xiàn)pyv8模塊安裝很麻煩,而且依賴的庫很多,編譯安裝也根據(jù)不同的操作系統(tǒng),存在各種坑,pyv8不適合普通用戶,于是就暫時擱置了pyv8模塊.
軟件界面
隨后我又比較了pyqt5與tkinter兩個模塊:
pyqt5功能很強,界面也漂亮,但語法比較復(fù)雜,pyqt5模塊需要單獨安裝,不適合新手入門;
tkinter是python3自帶的模塊,能滿足基本的功能需求,語法也簡單,基本上5分鐘就能上手,所以最終選擇了tkinter.

網(wǎng)上當前的python GUI教程存在的問題:

1.功能太簡單,基本功能就是"花式"顯示"Hello World";

2.注釋不明了,復(fù)制粘貼別人寫的博客代碼,代碼殘缺

3.版本老舊,都是針對python2.7的程序,導(dǎo)入方式如 import Tkinter,python3應(yīng)為import tkinter

這次作者選擇了一個 "根據(jù)ip地址定位地理位置"的腳本,作為本次教程的素材,比較好玩,也比較容易實現(xiàn):

解釋的內(nèi)容都放到了注釋里,上代碼:

import tkinter
import pygeoip

class FindLocation(object):
    def __init__(self):
        self.gi = pygeoip.GeoIP("./GeoLiteCity.dat")
        # 創(chuàng)建主窗口,用于容納其它組件
        self.root = tkinter.Tk()
        # 給主窗口設(shè)置標題內(nèi)容
        self.root.title("全球定位ip位置(離線版)")
        # 創(chuàng)建一個輸入框,并設(shè)置尺寸
        self.ip_input = tkinter.Entry(self.root,width=30)

        # 創(chuàng)建一個回顯列表
        self.display_info = tkinter.Listbox(self.root, width=50)

        # 創(chuàng)建一個查詢結(jié)果的按鈕
        self.result_button = tkinter.Button(self.root, command = self.find_position, text = "查詢")

    # 完成布局
    def gui_arrang(self):
        self.ip_input.pack()
        self.display_info.pack()
        self.result_button.pack()

    # 根據(jù)ip查找地理位置
    def find_position(self):
        # 獲取輸入信息
        self.ip_addr = self.ip_input.get()
        aim = self.gi.record_by_name(self.ip_addr)
        # 為了避免非法值,導(dǎo)致程序崩潰,有興趣可以用正則寫一下具體的規(guī)則,我為了便于新手理解,減少代碼量,就直接粗放的過濾了
        try:

            # 獲取目標城市
            city = aim["city"]
            # 獲取目標國家
            country = aim["country_name"]
            # 獲取目標地區(qū)
            region_code = aim["region_code"]
            # 獲取目標經(jīng)度
            longitude = aim["longitude"]
            # 獲取目標緯度
            latitude = aim["latitude"]
        except:
            pass
        
        # 創(chuàng)建臨時列表
        the_ip_info = ["所在緯度:"+str(latitude),"所在經(jīng)度:"+str(longitude),"地域代號:"+str(region_code),"所在城市:"+str(city), "所在國家或地區(qū):"+str(country), "需要查詢的ip:"+str(self.ip_addr)]
        #清空回顯列表可見部分,類似clear命令
        for item in range(10):
            self.display_info.insert(0,"")

        # 為回顯列表賦值
        for item in the_ip_info:
            self.display_info.insert(0,item)
        # 這里的返回值,沒啥用,就是為了好看
        return the_ip_info


def main():
    # 初始化對象
    FL = FindLocation()
    # 進行布局
    FL.gui_arrang()
    # 主程序執(zhí)行
    tkinter.mainloop()
    pass


if __name__ == "__main__":
    main()
    

運行效果(為了更好的演示效果,使用了gif圖,圖片尺寸較大,建議在wifi環(huán)境下觀看,土豪隨意~):

一張很有尺寸的演示圖!

由于離線查詢ip需要全球IP的分布數(shù)據(jù),所以我直接選擇了一個免費離線查詢ip的數(shù)據(jù)包,為了讀取這個包的數(shù)據(jù)還需要安裝一個模塊:pip install pygeoip,極少數(shù)人的當年安裝python3的時候,選了不含tkinter的python3安裝包,為了學(xué)習(xí),還是要把這個模塊補上:pip install tkinter

--- 9月27日更新----

如果想將示例程序轉(zhuǎn)為windows下的可執(zhí)行文件(.exe),參考這篇http://www.reibang.com/p/64cb9108a7c6

教程涉及到的資源我都通過百度網(wǎng)盤分享給大家,為了便于大家的下載,資源整合到了一張獨立的帖子里,鏈接如下:

http://www.reibang.com/p/4f28e1ae08b1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霎苗,更是在濱河造成了極大的恐慌,老刑警劉巖植捎,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贩挣,死亡現(xiàn)場離奇詭異,居然都是意外死亡把将,警方通過查閱死者的電腦和手機轻专,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來察蹲,“玉大人请垛,你說我怎么就攤上這事催训。” “怎么了宗收?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵漫拭,是天一觀的道長。 經(jīng)常有香客問我混稽,道長采驻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任匈勋,我火速辦了婚禮礼旅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洽洁。我一直安慰自己痘系,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布饿自。 她就那樣靜靜地躺著汰翠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昭雌。 梳的紋絲不亂的頭發(fā)上奴璃,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音城豁,去河邊找鬼苟穆。 笑死,一個胖子當著我的面吹牛唱星,可吹牛的內(nèi)容都是我干的雳旅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼间聊,長吁一口氣:“原來是場噩夢啊……” “哼攒盈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拂玻,失蹤者是張志新(化名)和其女友劉穎谋竖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迎变,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年飘言,在試婚紗的時候發(fā)現(xiàn)自己被綠了衣形。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡姿鸿,死狀恐怖谆吴,靈堂內(nèi)的尸體忽然破棺而出倒源,到底是詐尸還是另有隱情,我是刑警寧澤句狼,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布笋熬,位于F島的核電站,受9級特大地震影響腻菇,放射性物質(zhì)發(fā)生泄漏突诬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一芜繁、第九天 我趴在偏房一處隱蔽的房頂上張望旺隙。 院中可真熱鬧,春花似錦骏令、人聲如沸蔬捷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽周拐。三九已至,卻和暖如春凰兑,著一層夾襖步出監(jiān)牢的瞬間妥粟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工吏够, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾给,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓锅知,卻偏偏與公主長得像播急,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子售睹,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容