1. 程式人生 > >這可能是最好玩的python GUI入門例項!

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

簡單的說,GUI程式設計就是給程式加上圖形化介面. python的指令碼開發簡單,有時候只需幾行程式碼就能實現豐富的功能,而且python本身是跨平臺的,所以深受程式設計師的喜愛. 如果給程式加一個圖形化介面,那麼普通的使用者也就能用上python的指令碼,極大提升工作效率,所以給python程式加上圖形化介面,把自己寫的指令碼,提供給普通使用者,的確是一件激動人心的事!

如何給python指令碼加圖形化介面? 作者首先考慮了通過瀏覽器執行python的圖形化介面,為了理想的效果,python需要藉助javascript實現一些功能,而且python需要額外安裝pyv8模組,我折騰了一下,發現pyv8模組安裝很麻煩,而且依賴的庫很多,編譯安裝也根據不同的作業系統,存在各種坑,pyv8不適合普通使用者,於是就暫時擱置了pyv8模組.

隨後我又比較了pyqt5與tkinter兩個模組: pyqt5功能很強,介面也漂亮,但語法比較複雜,pyqt5模組需要單獨安裝,不適合新手入門; tkinter是python3自帶的模組,能滿足基本的功能需求,語法也簡單,基本上5分鐘就能上手,所以最終選擇了tkinter. 網上當前的python GUI教程存在的問題: 1.功能太簡單,基本功能就是"花式"顯示"Hello World"; 2.註釋不明瞭,複製貼上別人寫的部落格程式碼,程式碼殘缺 3.版本老舊,都是針對python2.7的程式,匯入方式如 import Tkinter,python3應為import tkinter 這次作者選擇了一個 "根據ip地址定位地理位置"的指令碼,作為本次教程的素材,比較好玩,也比較容易實現: 解釋的內容都放到了註釋裡,上程式碼:

import tkinter
import pygeoip

class FindLocation(object):
    def __init__(self):
        self.gi = pygeoip.GeoIP("./GeoLiteCity.dat")
        # 建立主視窗,用於容納其它元件
        self.root = tkinter.Tk()
        # 給主視窗設定標題內容
        self.root.title("全球定位ip位置(離線版)")
        # 建立一個輸入框,並設定尺寸
        self.ip_input = tkinter.Entry(self.root,width=30)

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

        # 建立一個查詢結果的按鈕
        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()

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

            # 獲取目標城市
            city = aim["city"]
            # 獲取目標國家
            country = aim["country_name"]
            # 獲取目標地區
            region_code = aim["region_code"]
            # 獲取目標經度
            longitude = aim["longitude"]
            # 獲取目標緯度
            latitude = aim["latitude"]
        except:
            pass

        # 建立臨時列表
        the_ip_info = ["所在緯度:"+str(latitude),"所在經度:"+str(longitude),"地域代號:"+str(region_code),"所在城市:"+str(city), "所在國家或地區:"+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()
    # 主程式執行
    tkinter.mainloop()
    pass


if __name__ == "__main__":
    main()

由於離線查詢ip需要全球IP的分佈資料,所以我直接選擇了一個免費離線查詢ip的資料包,為了讀取這個包的資料還需要安裝一個模組:pip install pygeoip,極少數人的當年安裝python3的時候,選了不含tkinter的python3安裝包,為了學習,還是要把這個模組補上:pip install tkinter