美文网首页进击的Python语言Python常用模块
这可能是最好玩的python GUI入门实例!

这可能是最好玩的python GUI入门实例!

作者: zhaoolee | 来源:发表于2017-09-16 23:47 被阅读17061次
image.png

简单的说,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()
    

运行效果(为了更好的演示效果,使用了gif图,图片尺寸较大,建议在wifi环境下观看,土豪随意~):

一张很有尺寸的演示图!

由于离线查询ip需要全球IP的分布数据,所以我直接选择了一个免费离线查询ip的数据包,为了读取这个包的数据还需要安装一个模块:pip install pygeoip,极少数人的当年安装python3的时候,选了不含tkinter的python3安装包,为了学习,还是要把这个模块补上:pip install tkinter

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

如果想将示例程序转为windows下的可执行文件(.exe),参考这篇http://www.jianshu.com/p/64cb9108a7c6

教程涉及到的资源我都通过百度网盘分享给大家,为了便于大家的下载,资源整合到了一张独立的帖子里,链接如下:

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

相关文章

网友评论

  • 杨强AT南京:tkinter写GUI太渣!对多线程的支持要命的!尤其第一图像的二级缓存支持!做动画基本上就是闪屏!
  • 99da50cf8453:加深了面相对象的理解
  • 笑而不语_ddbd:self.gi = pygeoip.GeoIP("./GeoLiteCity.dat")
    你好这句的作用是什么我不太懂,最近一直在研究这方面,请你解答一下
    GeoLiteCity.dat这个是做什么
    海边拾贝2018:@笑而不语_ddbd 这是一个ip地址查询包
  • niunan:支持支持
  • 肥宅_Sean:真的是学到了很多东西!
  • e6623f0f8df3:请问dat用什么打开,想着多放点数据玩玩😁
  • 天各一方_007:我想问问这种桌面程序以后还能流行吗? web时代了不是?移动时代了不是?顺便说下我能邀请你来我的Python群吗?我们需要Python高手交流技术。
  • 仰望星空的先生:sudo apt install python3-tk
  • 0c3edfba7374:可以尝试下wxpython
  • 8526b56d7954:sourceforge上对python的tk有一个拖拽绘制的工具的,不用手撸代码
    8526b56d7954:@袁小猴 去安装Anaconda3 ,然后把wish所在目录加入环境变量, 我的目录是X:\Anaconda_Python\Library\bin
    wish.exe是tcl的脚本执行引擎的exe接口
    袁小猴的故事:@测不准52 下载安装起来好像没办法用咯,没有wish.exe执行文件~page-4.17版本
    8526b56d7954:一个是 http://page.sourceforge.net,还有一个pygubu,
    还是很方便的拖曳绘制,然后生成py代码
  • Vonelone:循着大尺寸图片进来的,没想到被喂了一口py
  • dda10136fb6a:现实的软件有太多因素考虑,历史性,运行环境,安全性,稳定性等等。简单小程序,这个是足够了。
  • 扬沙沙:如果有合适的界面,就不会花成本再学c#了

本文标题:这可能是最好玩的python GUI入门实例!

本文链接:https://www.haomeiwen.com/subject/ngzusxtx.html