零基础学编程036:快速编写一个GUI程序

在《零基础学编程035:群发邮件并不难》里,我们学会了发邮件,我用于向shenlongbin@sync.omnigroup.com发送一封邮件,就可以实现GTD的快速收集。

写程序没有GUI界面,好像显得不专业。什么是GUI?当然是指图形用户界面了,黑客们都用黑窗口Console+键盘,很少用鼠标,而给普通用户们还得用方便友好的窗口界面。

话说HTML浏览器的盛行,让桌面端的应用越来越少,以前编写复杂的用户界面程序的本领,当今则变得无用武之地。Python中的用户界面程序体系也是相当的复杂,今天来个简单可上手的,它就是guidata。

安装

如果你安装的是WinPython,则系统中已经包含了guidata模块包。如果没有安装也不要紧,正好可以复习《零基础学编程027:站在巨人的肩膀上》这一节,一行命令搞定:

python -m pip install guidata

快速上手

先从guidata的官方说明手册中抄来一段代码,修改一下:

import guidata
_app = guidata.qapplication()

import guidata.dataset.datatypes as dt
import guidata.dataset.dataitems as di

class MailData(dt.DataSet) :
    """ 准备发邮件 """
    subject = di.StringItem("邮件标题")
    content = di.TextItem("邮件内容")
    
mail = MailData()
mail.edit()

print(mail.subject)
print(mail.content)

运行后,应该能够出现一个Windows程序,是不是很神奇?

在单行文本框、多行文本框中随便输入些文字,点击OK按钮后,看看Python的IDLE控制台输出什么?

详细说明

_app = guidata.qapplication()

这行代码建立一个GUI应用的实例,搞不清说的啥?实际内部的细节也不用管了,guidata背后依赖Qt,Qt又是啥?Qt是一款跨平台的图形界面开发框架。框架又是啥?先不谈框架了,程序员们的术语就是多。图形界面程序背后要完成许多许多的初始化事情,这行代码能把这些事情都准备好。

class MailData(dt.DataSet) :

在《零基础学编程028:面向对象编程OOP》里介绍过类class,这里利用dt.DataSet建立了一个子类MailData,子类会继承父类的所有特性,很多内部如何实现的细节也不用考虑了。

""" 准备发邮件 """

这是Python中的多行字符串,用来说明类的用途,在定义或函数定义之后写上这条语句是个良好的习惯,将来这行语句还可以生成代码的使用说明文档。

subject = di.StringItem("邮件标题")
content = di.TextItem("邮件内容")

这两行负责获取一个单行的字符串到subject中,并把多行的文本保存在content变量中,内部细节也不用管。复习一下面向对象编程OOP的概念,这两个变量应该叫做成员变量

mail = MailData()

声明一个对象实例mail,一个类class可以产生多个实例instance

mail.edit()

此时会出现Windows GUI界面窗口,你输入的任何内容,在点击OK按钮后,会自动赋值给subject和content那两个变量中。

最后的程序

合并《零基础学编程035:群发邮件并不难》上一节的代码,我们就可以做一个带用户界面的向指定邮箱发送邮件的小程序了。

import guidata
_app = guidata.qapplication()

import guidata.dataset.datatypes as dt
import guidata.dataset.dataitems as di

class MailData(dt.DataSet) :
    """ 准备发邮件 """
    subject = di.StringItem("邮件标题")
    content = di.TextItem("邮件内容")
    
mail = MailData()
mail.edit()
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg.set_content(mail.content)

msg['Subject'] = mail.subject
msg['From'] = 'shenlongbin@qq.com'  #请换成你的邮箱
msg['To'] = 'slb-omnifocus@sync.omnigroup.com' #请换成你的邮箱

s = smtplib.SMTP('smtp.qq.com') #请查询你的邮箱服务商的SMTP主机域名
s.login('shenlongbin', 'Password') #请换成你的邮箱用户名和密码
s.send_message(msg)
s.quit()

小结:

  • GUI是图形用户界面
  • Qt是个跨平台的图形用户界面开发框架
  • guidata可以自动生成一个简单的用户界面,收集到一个类的成员变量中
  • 搞明白类class和实例instance的关系
  • 三个引号是多行字符串,在类、函数之后写上描述性的文字是个好习惯
  • 子类继承父类的所有特性,不用操心内部的实现细节

--- END ---

原文发布于微信公众号 - 申龙斌的程序人生(slbGTD)

原文发表时间:2017-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序你好

如何用7个简单的步骤,在Firefox开发工具中调试JavaScript

本文将着重于在Firefox的开发工具中调试JavaScript代码。Firefox中的开发工具是一个非常强大的工具,可以加速您的bug查找和修复过程!

886
来自专栏短信防刷

腾讯云短信图片验证码防刷接入指引

开发者采用腾讯云短信做短信注册登陆验证码时,注册登陆页面暴露在外网给用户使用。恶意分子会利用从网站上找到的短信发送 URL ,发送 HTTP 请求,每次请求给用...

3288
来自专栏前端杂谈

使用vue开发项目需要注意的问题和可能踩到的坑

最近,在公司给一些刚刚使用vue进行开发的同学做了一次分享, 其中包括一些vue开发中需要注意的点, 以及一些可能会踩到的坑.具体内容如下:

752
来自专栏小樱的经验随笔

IPython使用学习笔记

学习《利用python进行数据分析》第三章 IPython:一种交互式计算和开发环境的笔记,共享给大家,同时为自己作为备忘用。 ? 安装ipython用pip即...

2505
来自专栏Python中文社区

Python爬虫核心模块urllib的学习

因为在玩Python challenge的时候,有用过这个模块,而且学习这个模块之后也对系统学习网络爬虫有用。 当时查了各种资料...

2065
来自专栏黄Java的地盘

旧项目TypeScript改造问题与解决方案记

由于本次改造的项目为一个通过NPM进行发布的基础服务包,因此本次采用TypeScript进行改造的目标是移除Babel全家桶,减小包体积,同时增加强类型约束从而...

391
来自专栏JadePeng的技术博客

Angular快速学习笔记(2) -- 架构

1612
来自专栏菩提树下的杨过

Flash/Flex学习笔记(1):Hello World!

万世开头难,先来一个Hello World!吧,Adobe出了二款支持Action Script3语言的经典开发工具,即:Flash CS 与Flash Bui...

1655
来自专栏测试开发架构之路

今天研究了一下手机通信录管理系统(C语言)

题目:手机通信录管理系统 一、题目要求 二、需求分析 三、设计步骤/编写代码 四、上机/运行结果 五、总结 一、题目要求 模拟手机通信录管理系统,实现对手机中...

2958
来自专栏IMWeb前端团队

测试工具mocha用法小结

这篇是前段时间总结给自己备忘的,要用到的工具实在太多,没法一一记住。 个人感觉,作为一个测试的工具,只要会用就好了。 所以这里稍微做了一些修改,简单介绍一下常用...

2490

扫描关注云+社区