Python爬糗百热门20条并邮件分发+wxPython简易GUI+py2app转成可执行文件

wxPython中wx.App类用法 wx.App类表示wxPython视窗应用,其作用引导 wxPython 视窗应用,初始化底层的GUI 工具包;设置和获取wxPython视窗应用的全局属性;实现wxPython视窗应用主消息或事件循环和事件绑定。 阅读详情

学了一阵子Python,拿来做个什么有意思的东西呢?爬糗百好了,爬到的内容,邮件分发出去。

然后又啃了两天的wxpython,做了个简易的邮件管理界面,可以在这里增加或者删除邮件,并且一键爬虫发送。

最后,索性封装成APP吧,又试了一把py2app,简单好用。

由于是让用户自行添加和删除邮箱,所以程序一定要兼顾到各种情况:比如输入的邮箱格式不合法,输入的邮箱里包含中文字符,分隔符不对,删除了全部邮箱然后又要发邮件等问题。



首先是QiuBai.py:爬虫,正则匹配我们想要的内容,然后将内容稍作处理返回。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import urllib2
__author__ = 'Sophie2805'

class FetchData(object):
    def __init__(self,URL,referURL,pattern_1,pattern_2):
        self.URL = URL
        self.pattern_1 = pattern_1
        self.patttern_2 = pattern_2
        self.referURL = referURL

    def getHtml(self):
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
            'Referer':self.referURL  #http://www.qiushibaike.com/
        }
        req = urllib2.Request(
            url = self.URL, #http://www.qiushibaike.com/text
            headers = headers)
        return urllib2.urlopen(req).read()

    def getData(self,html):
        p_1 = re.compile(self.pattern_1)
        div_content = p_1.findall(html.decode('utf8'))
        row = 0
        for m in range(len(div_content)):
            div_content[m] = re.sub(self.patttern_2,'',div_content[m])
            div_content[m] = ("---" + str(row+1) + "---" + div_content[m]).encode('utf-8')
            row += 1
        return div_content


接下来就是mail.py,注意,发送人的邮箱要检查下是否打开了SMTP协议

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header

__author__ = 'Sophie2805'

class SMail:
    def __init__(self):
        self.sender = '***@qq.com'
        self.receiver = ['***@163.com','***@qq.com']
        self.subject = '糗百热门20条推送'
        self.username = '***@qq.com'
        self.password = '******'

    def send_mail(self,msg):
        try:
            self.msg = MIMEText(msg,'plain','utf-8')
            self.msg['Subject'] = Header(self.subject,'utf-8')
            self.msg['To'] = ','.join(self.receiver)
            self.msg['From'] = self.sender
            self.smtp = smtplib.SMTP()
            self.smtp.connect('smtp.qq.com')
            self.smtp.login(self.username,self.password)
            self.smtp.sendmail(self.msg['From'],self.receiver,self.msg.as_string())
            self.smtp.quit()
            return '1'
        except Exception, e:
            return str(e)

最后,用wxpython做了个简易的收件人管理界面,Spider_QiuBai.py,实现:增加邮件、删除邮件、一键爬虫发送糗百热门20条到邮件列表。

当然,为了程序正确运行,会有各种验证,比如输入的邮箱格式是否合法,发送时检查receiver列表是否为空等

程序比较简单,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
__author__ = 'Sophie2805'

import wx
import wx.grid
from mail import *
from QiuBai import *

class Frame(wx.Frame):
    QiuBai = None
    content = None
    m = SMail()
    def __init__(self, parent=None, title='Get the Hottest QiuBai!',size=(450, 630),
                 style=wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER |wx.MAXIMIZE_BOX)):
        wx.Frame.__init__(self, parent=parent,  title=title, size=size,style = style)
        self.Centre()
        panel = wx.Panel(self,-1)

        self.text_Email = wx.StaticText(panel,1, "You want it too? Add your email below. Using ';' between multiple emails. Existing emails will not be added again.")
        self.input_Email = wx.TextCtrl(panel,2)
        self.button_Email = wx.Button(panel,3,label='+')

        '''Bind with function'''
        self.button_Email.Bind(wx.EVT_BUTTON,self.add)

        self.text_DeleteEmail = wx.StaticText(panel,4, "Existing receivers are listed below. You can delete by double clicking them and clicking on '-' button. Please note that it can hold 20 emails at most one time.")

        '''grid'''
        self.grid = wx.grid.Grid(panel,5)
        self.grid.CreateGrid(20,1)
        self.grid.EnableEditing(False)
        self.grid.SetColSize(0,200)
        self.grid.SetColLabelValue(0,'Emails')
        for i in range(len(self.m.receiver)):
                self.grid.SetCellBackgroundColour(i,0,"grey")
                self.grid.SetCellValue(i,0,self.m.receiver[i])

        self.grid.Bind(wx.grid.EVT_GRID_CELL_LEFT_DCLICK,self.grid_change_color)

        self.button_DeleteEmail = wx.Button(panel,6,label='-')
        self.button_Send = wx.Button(panel,7,label='send')

        '''Bind with function'''
        self.button_Send.Bind(wx.EVT_BUTTON,self.sendmail)
        self.button_DeleteEmail.Bind(wx.EVT_BUTTON,self.d_emails)

        '''BoxSizer'''
        '''================================================================'''
        add_Email = wx.BoxSizer() #input box and add button
        add_Email.Add(self.input_Email,proportion=4,flag = wx.LEFT, border = 5)
        add_Email.Add(self.button_Email,proportion=1,flag=wx.LEFT,border=15)

        ae = wx.BoxSizer(wx.VERTICAL)
        ae.Add(self.text_Email,proportion =4, flag=wx.ALL, border=5)
        ae.Add(add_Email,proportion=2, flag=wx.LEFT|wx.BOTTOM|wx.RIGHT, border=5)

        h_b = wx.BoxSizer()#send button and delete button
        h_b.Add(self.button_Send,flag=wx.LEFT,border=5)
        h_b.Add(self.button_DeleteEmail,flag=wx.LEFT,border=250)

        de = wx.BoxSizer(wx.VERTICAL)
        de.Add(self.text_DeleteEmail,proportion=2,flag=wx.ALL, border=5)
        de.Add(self.grid,proportion = 4,flag=wx.LEFT, border=80)
        de.Add(h_b,proportion=1,flag=wx.TOP, border=10)

        vBoxSizer = wx.BoxSizer(wx.VERTICAL)
        vBoxSizer.Add(ae,proportion=2,flag=wx.ALL,border=5)
        vBoxSizer.Add(de,proportion=4,flag=wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)
        panel.SetSizer(vBoxSizer)

    #delete the emails that cell bk color changed to yellow
    def d_emails(self,evt):
        count_yellow = 0
        for i in range(len(self.m.receiver)):
            if self.grid.GetCellBackgroundColour(i,0)==(255, 255, 0, 255): # yellow
                count_yellow += 1

        if count_yellow == 0:
            wx.MessageBox('Wake up!\nSelect then delete!')

        else:
            l = len(self.m.receiver)
            self.m.receiver=[]
            for i in range(l):
                if self.grid.GetCellBackgroundColour(i,0)==(128, 128, 128, 255):#grey
                    self.m.receiver.append(self.grid.GetCellValue(i,0))
                self.grid.SetCellValue(i,0,'')#clear the cell's value
                self.grid.SetCellBackgroundColour(i,0,'white')

            for i in range(len(self.m.receiver)):
                self.grid.SetCellBackgroundColour(i,0,"grey")
                self.grid.SetCellValue(i,0,self.m.receiver[i])
            self.grid.ForceRefresh()

    #change cell bk color when double click the cell. The cell without value will not be changed
    def grid_change_color(self,evt):
        if self.grid.GetCellValue(self.grid.GridCursorRow,self.grid.GridCursorCol) != '':
            if self.grid.GetCellBackgroundColour(self.grid.GridCursorRow,self.grid.GridCursorCol)==(128, 128, 128, 255):#grey
                self.grid.SetCellBackgroundColour(self.grid.GridCursorRow,self.grid.GridCursorCol,'yellow')
            else:
                self.grid.SetCellBackgroundColour(self.grid.GridCursorRow,self.grid.GridCursorCol,'grey')
        self.grid.ForceRefresh()

    #add the emails that user input
    def add(self,evt):
        x = str(self.input_Email.GetValue().encode('utf-8'))
        if len(x) == 0:
            wx.MessageBox('Hey dude, input something first!')
        elif len(x) != len(x.decode('utf-8')):#non ASCII character contained
            wx.MessageBox('Hey dude, please input English character only!')
        else:
            x = x.split(';')
            tag = 0
            for i in range(len(x)):
                if len(x[i]) != 0:
                    if x[i] in self.m.receiver:
                        x[i]=''#existing emails, set to ''
                    elif self.validate_email(x[i]) == None:
                        wx.MessageBox('Hey dude, eyes wide open! \nPlease input like this: xxx@xxx.com;eee@eee.org')
                        tag = 1
                        break
            if tag == 0: # all emails are valid
                for item in x:
                    if len(item) != 0:
                        self.m.receiver.append(item)
                for i in range(len(self.m.receiver)):
                    self.grid.SetCellBackgroundColour(i,0,"grey")
                    self.grid.SetCellValue(i,0,self.m.receiver[i])
                self.input_Email.Clear()
                self.grid.ForceRefresh()

    #validate the emails user input
    def validate_email(self,s):
        pattern = "^[a-zA-Z0-9\._-]+@([a-zA-Z0-9_-]+\.)+([a-zA-Z]{2,3})$"
        p = re.compile(pattern)
        return p.match(s)

    def sendmail(self,evt):
        if len(self.m.receiver) == 0:
            wx.MessageBox('Are you kidding me?\n Add some receivers then send!')
        else:
            self.QiuBai = FetchData('http://www.qiushibaike.com/text','http://www.qiushibaike.com/',
                                '<div class="content">[\n\s]+.+[\n\s]','[<div class="content"><br/>\n]')
            self.content = self.QiuBai.getData(self.QiuBai.getHtml())
            msg = '\n\n'.join(self.content)
            result = self.m.send_mail(msg)
            if result == '1':
                wx.MessageBox('The hottest QiuBai had been sent.\n Enjoy it ^_^ !')
            else:
                wx.MessageBox('Some exception occurred :-(\nTry again later...\n'+result)
class GetQiuBaiApp(wx.App):
    def OnInit(self):
        frame = Frame()
        frame.Show()
        return True

if __name__ == "__main__":
    app = GetQiuBaiApp()
    app.MainLoop()


最后就是Python转APP了:

(1)在MAC终端里输入pip install py2app安装py2app

(2)创建setup.py,我的project位于/Users/Sophie/PycharmProjects/QiuBai,所以cd到这个路径下,然后vi setup.py,在这个文件里输入如下内容(提前准备个icns图标,放到project路径下)

"""

py2app build script for MyApplication


Usage:

    python setup.py py2app

"""

from setuptools import setup

OPTIONS = {

    'iconfile':'lemon.icns'

}

setup(

    app=["Spider_QiuBai.py"],

    options={'py2app': OPTIONS},

    setup_requires=["py2app"],

)

(3)rm -rf build dist(如果重复多次打包的话,这个命令是需要的,第一次不需要)

(4)python setup.py py2app 用这个命令打包,打包好的app会存放在该路径下的dist路径下,我的如下:/Users/Sophie/PycharmProjects/QiuBai/dist 


至此,这个小玩意儿已经做好了,其中略麻烦的可能就是正则还有界面了 Hope you enjoy it ^ ^

Python+wxpython邮件收发客户端 python+wxpython写的一个邮件收发客户端,原来一直用C++,最近一周学习了Python。这个小作品实现了邮件收发(能很好的解码pop3中文),账户管理(增加,删除,编辑,更换)。显示文件内容用了htmlwindow,对网页邮件也能够很好的显示。发送模块支持中文和附件,有问题的可以发邮件到jianger2005@sina.com或者csdn论坛给我发消息 立即下载

相关推荐

Python-marrowmailer高性能可扩展邮件分发框架

marrow.mailer:高性能可扩展邮件分发框架

python如何做成app

文章目录python如何做成app?一、Python3.8.3版本+kivy1.10.0二、用命令提示符(可cmd弹出)安装查找kivy等各种依赖包三、验证 kivy 安装四、安装上虚拟机VirtualBox总结 python如何做成app? 工具:python-3.8.3-amd64.exe+kivy1.10.0+VirtualBox-6.1.34-150636-Win.exe Kivy 是一套用于跨平台快速应用开发的开源框架,只需编.

weixin_39378260的博客 1万+

Android-将您的Python应用程序转换为AndroidAPK

将您的Python应用程序转换为Android APK

python代码如何打包成app,python打包成应用程序

这篇文章主要介绍了如何把python 代码打包成可执行软件,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。使用PyInstaller:PyInstaller是一个可将Python代码打包成独立可执行文件的工具。它会将你的代码及其依赖项打包到一个文件夹或单个可执行文件中。你可以按照以下步骤使用PyInstaller:首先,确保你已经在系统中安装了PyInstaller。执行完上述命令后,PyInstaller会在同一目录下生成一个dist。

2401_82891570的博客 2315

从代码到应用:打包你的Python为可执行的exe或app

很多时候我们用python编写了一些程序或者工具之后,可能需要在其他电脑上运行它,或者与不会编程的人分享。这时候我们就需要用到可以把python打包成可执行文件的工具,例如:Pyinstaller、Py2app、cx_Freeze等。在这里,我将分享一些我们在使用这些工具进行打包过程中遇到的一些问题和解决方法。

qq_17716819的博客 6053

chatgpt赋能pythonPython代码如何打包成App-一个详细指南

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

aijinglingchat的博客 3427

Python学习之Python代码如何打包成应用

使用PyInstaller:PyInstaller是一个可将Python代码打包成独立可执行文件的工具。它会将你的代码及其依赖项打包到一个文件夹或单个可执行文件中。你可以按照以下步骤使用PyInstaller:首先,确保你已经在系统中安装了PyInstaller。执行完上述命令后,PyInstaller会在同一目录下生成一个dist文件夹,其中包含可执行文件以及其他必要的文件。使用cx_Freeze:cx_Freeze是另一个用于将Python代码打包成可执行文件的工具。

分享型博主 2483

Python热门20邮件分发+wxPython简易GUI+py2app转成可运行文件

学了一阵子Python,拿来做个什么有意思的东西呢?好了。到的内容,邮件分发出去。 然后又啃了两天的wxpython,做了个简易邮件管理界面,能够在这里添加或者删除邮件,而且一键爬虫发送。 最后,索性封装成APP吧。又试了一把py2app。简单好用。 因为是让用户自行加入和删除邮箱。所以程序一定要兼顾到各种情况:比方输入的邮箱格式不合法。输入的邮箱里包括中文字符,分隔符不正...

weixin_33875564的博客 178

PywxPythonwxPython的简介、安装、使用方法之详细攻略

wxPythonPython编程语言的跨平台GUI工具包。它允许Python程序员创建具有健壮、功能强大的图形用户界面的程序,而且简单、容易。它是作为一组Python扩展模块实现的,这些模块封装了流行的wxWidgets跨平台库的GUI组件,该库是用c++编写的。由于编程语言是Python, wxPython程序很简单,易于编写和理解。像Python和wxWidgets一样,wxPython是开源的,这意味着任何人都可以免费使用它,源代码也可以供任何人查看和修改。

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1万+

python打包成mac可执行文件,python打包mac可执行文件

大家好,小编为大家解答python打包成mac可执行文件的问题。很多人还不知道python打包mac可执行文件,现在让我们一起来看看吧!注意:之前网上有说Python新版本不支持使用PyInstaller,本人亲测是支持的,请大家放心。PyInstaller是同时支持Windows和macOS的软件,它有一点比较好:在macOS上打包的便是UNIX可执行文件,在Windows上打包的便是exe文件

Night368的博客 1716

wxPythonpython首选的GUI

跨平台的GUI工具库,较为有名的当属GTK+、Qt 和 wxWidgets 了。GTK+是C实现的,由于C语言本身不支持OOP,因而GTK+上手相当困难,写起来也较为复杂艰涩。Qt 和 wxWidgets 则是C++实现的,各自拥有庞大的用户群体。虽然我喜欢wxWidgets,但还是尽可能客观地搜集了关于Qt 和 wxWidgets 的对比评价。

Python作业辅导员 - 天元浪子 14万+

如何将python代码封装成app_python打包成可执行文件app

1.mac程序打包成app有两个方案一个 pyinstaller 已经测试过了。没有打包成功。py2app可以成功打包。2.安装py2app3.打包app比如一个简单的gui,hello.py!/usr/bin/env pythonimport wxapp = wx.App(False) # Create a new app, don't redirect stdout/stderr to a ...

weixin_39849070的博客 4144

wxpython 介绍

wxpython 基础知识介绍

qq_31644655的博客 2万+

python2安装wxpython模块源

在MyFrame类的构造函数中,我们设置了窗口的标题、大小,创建了一个面板panel和垂直布局box,然后在面板上添加了一个静态文本控件m_text。最后,我们创建了一个应用程序实例app,创建了MyFrame的实例frame,启动了应用程序的主事件循环。通过这样的方式,可以在Python 2中使用wxPython模块来开发图形界面应用程序,比如简单的工具、小型应用等。请注意,由于Python 2的支持已经结束,建议尽快迁移到更现代的Python 3版本,以获取更好的支持和性能。

牛肉胡辣汤 1262

wxpython打包应用程序_将wxpython应用程序与py2app打包将改变GUI行为

我正在开发的wxpython应用程序有一些非常奇怪的行为。当我直接运行应用程序时(例如python)/主.py),一切正常。然而,当我运行应用程序的打包版本(用py2app制作)时,我会遇到一些奇怪的行为。在特别是:我有一个复选框,当选中时,会打开一个wx.框架. 当直接运行应用程序时,它可以正常工作。当我使用打包版本时,第一次单击复选框时什么都不会发生。为了让窗口显示出来,我必须取消选中复选框,...

weixin_36259939的博客 219

如何将python转成app_将python脚本转换为webapp的最简单方法是什么?

我把编程作为一种业余爱好。我使用java和python,我知道HTML。我写了下面的python脚本。我想把它变成一个webapp。也就是说,你在网页上按一个按钮,脚本在服务器上运行,它随机挑选wav文件,把它们拼凑在一起,然后我希望wav文件的链接出现在网页上,这样用户就可以播放它了。我也希望解决方案显示在网页上。我已经调查过烧瓶和django,这有点让人望而生畏。似乎这都是关于数据库和身份验证...

weixin_32353247的博客 1811
上一篇: Python @property装饰器
下一篇: Python requests 自动登录某财BBS,自动签到打卡领铜钱,最后再配个plist,每天自动执行
苏雨田
博客等级 码龄14年 51粉丝 76原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值