吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3275|回复: 18
收起左侧

[Python 转载] 萌新的tkinter应用

[复制链接]
Zeaf 发表于 2020-3-16 21:32
先放上学习资源:https://www.cnblogs.com/aland-1415/p/6849193.html
看着看着就一直玩,布局这个东西真是难顶{:1_908:}
然后放上以前写的东西...一个四不像的集合...
反正先这样吧,打包是不敢打包的(这引用的库的数量属实可怕)
再次感谢大佬的帖子引起了我对这个库的兴趣:@打字的小强
他的帖子:https://www.52pojie.cn/thread-1131919-1-1.html
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
"""
Created on Mon Mar 16 17:47:23 2020

@author: Zeaf
"""

import tkinter as tk
from tkinter import END  #单独把这个申明是因为后面的往text控件插入内容会报错
import requests,re,time,codecs,os
import pandas as pd # 导入pandas库
import matplotlib.pyplot as plt
import wordcloud as wc
import pandas as pd

zeaf=tk.Tk() #生成root主窗口
zeaf.title("工具箱[url=home.php?mod=space&uid=686208]@AuThor[/url] Zeaf") #窗口标题
zeaf.geometry("1000x500") #窗口大小,中间是英文x,而不能是运算符*,很搞笑
#zeaf.resizable(0,0) #框体大小可调性,分别表示x,y方向的可变性,0即指不能缩放;
tk.Label(zeaf,text="如出现问题请联系作者!",font=("华文行楷", 20)).place(x=50,y=20)
tk.Label(zeaf, text="输入:", font=13).place(x=40,y=100)#贴标签
tk.Label(zeaf, text="其它:", font=13).place(x=40,y=205)#贴标签
tk.Label(zeaf, text="输出:", font=13).place(x=400,y=60)#贴标签
#输入值与输入框
input_1=tk.StringVar()
tk.Entry(zeaf, font=10, textvariable = input_1).place(x=100,y=100)
#加入滑动条!!!
scrollbar=tk.Scrollbar(zeaf)
scrollbar.place(x=900,y=100,height=300)
text=tk.Text(zeaf, font=10,yscrollcommand=scrollbar.set)#yscrollcommand=scrollbar.set设置滑动条
text.place(x=400,y=100,width=500,height=300)
scrollbar.config(command=text.yview)#.config(command=text.yview)同步text内容
text.insert(END, 'Github:https://github.com/Zeal-fj/my/tree/python\n无响应时请看cmd窗口,iso图片需开代{过}{滤}理。')

def get_douyin(): 
    share = input_1.get()#千万记得加括号!
    pat = '(https://v.douyin.com/.*?/)'  
    url_in = re.compile(pat)
    try:
        url = url_in.findall(share)[0]#正则匹配分享链接    
        headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3904.108 Safari/537.36'
        }
        r = requests.get(url, headers=headers)
        pat = 'playAddr: "(.*?)",'
        play = re.compile(pat).findall(r.text)[0].replace("playwm", "play")
        headers = {
            'user-agent': 'Android',
        }
        r = requests.get(play, headers=headers, allow_redirects=False)
        geturl = r.headers['location']
        response = requests.get(geturl, headers=headers)
        text.insert(END, '\n获取到的链接:\n'+geturl)
        with open('短视频.mp4', 'wb') as f:  # 用wb模式打开创建文件,w写模式
            f.write(response.content)  # 写入二进制文件内容  
            f.close
            text.insert(END, '\n保存成功!')
    except:
        text.insert(END, '\n获取链接失败或输入有误!')
      
tk.Button(zeaf, text='抖音解析',command=get_douyin).place(x=120,y=150)#加按钮,调用方法千万别加括号!!!

def get_law():
    user = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
    }
    response = requests.get('http://www.pkulaw.cn/cluster_form.aspx?Db=news&menu_item=law&EncodingName=&keyword=%u884C%u653F%u590D%u8BAE%u6CD5&range=name&',headers=user)  # 用requests库的get函数访问总网页,用headers进行伪装,获得源码
    html = response.text  # 用文本显示访问网页得到的内容
    urls = re.findall('href="(.*?)" target="_blank"', html)  # 用正则表达式获得所有文章网址
    #创建空列表用于存储数据
    title_in = []
    date_in = []
    place_in = []
    keyword_in = []
    url_in = []
    for url in urls:#循环输出获得的网址
        time.sleep(1)#暂停1s
        url= 'http://www.pkulaw.cn/'+url#因为爬取得到的网址只是部分,故以此方式填充
        response = requests.get(url,headers=user)  # 用requests库的get函数访问总网页,用headers进行伪装,获得源码
        html = response.text  # 用文本显示访问网页得到的内容
        title = re.findall('<strong>(.*?)</strong>', html)  # 获取标题
        date = re.findall('【发布日期】</font> (.*?)</td>', html) # 获取日期
        place = re.findall('【来源】</font> (.*?)</td>', html) # 获取来源
        keyword = re.findall('【关键词语】</font> <a href=".*?" target=_blank>(.*?)</a>', html) # 获取关键词
        #合并数据用于制表
        title_in.append(title[0])#注意这里title为列表,须先读取后导入,下同
        date_in.append(date[0])
        place_in.append(place[0])
        keyword_in.append(keyword[0])
        url_in.append(url)
        print('保存中...')
    text.insert(END, '\n保存成功!')
    #导入数据
    data={'标题':title_in, '发布日期':date_in, '来源':place_in, '关键词语':keyword_in,'原文链接':url_in}
    y=pd.DataFrame(data)
    y.to_excel('news.xlsx',index=False)#制表
    text.insert(END, '\n表格生成成功!')   
    #绘制词云
    content = ' '.join(keyword_in)
    wordcloud = wc.WordCloud(max_words=50,font_path='simhei.ttf').generate(content)#黑体字
    plt.imshow(wordcloud)#绘制
    plt.show()
    wordcloud.to_file('news.jpg')#保存图片,可以d:\来指定目录
    text.insert(END, '\n词云生成成功!')
    
tk.Button(zeaf, text='新闻获取+生成表格+制作词云',command=get_law).place(x=100,y=200,width=248)#加按钮,调用方法千万别加括号!!!

def get_bilibili():
    url_in=[]#创建空列表
    keyword=input_1.get()#千万记得加括号!
    text.insert(END, '\n正在保存中...')
    try:
        for i in range(1,10):#运用循环语句输出多个页码,这里可改为列表
            if i==1:
                kw={'keyword':keyword,'page':'1'}#keyword是输入的关键词,page是页码
                r=requests.get(url='https://search.bilibili.com/all?',params=kw)
                r.encoding='utf8'#防止乱码
                print(r.status_code)#200即正常
                #建立html源码文本
                x=codecs.open('缓存区.txt','w','utf8')
                x.write(r.text)
                x.close()
                #正则表达式提取(真的难搞)
                title=re.findall('<a title="(.*?)" href="//www.bilibili.com/',r.text)#标题
                playbacknumber=re.findall('<span title="观看" class="so-icon watch-num"><i class="icon-playtime"></i>\n        (.*?)\n      </span>',r.text)#播放量
                uploadtime=re.findall('<span title="上传时间" class="so-icon time"><i class="icon-date"></i>\n        (.*?)\n      </span>',r.text)#上传时间
                upname=re.findall('class="up-name">(.*?)</a>',r.text)#up主
                url=re.findall('<a title=".*?" href="(.*?)" target="_blank" class="title">',r.text)#视频链接
            else:
                kw={'keyword':keyword,'page':i}
                r=requests.get(url='https://search.bilibili.com/all?',params=kw)
                r.encoding='utf8'
                print(r.status_code)
                x=codecs.open('缓存区.txt','w','utf8')#若想保存所有源码文件可以插入'+str(i)+',为节省空间采用此方式
                x.write(r.text)
                x.close()
                title_=re.findall('<a title="(.*?)" href="//www.bilibili.com/',r.text)
                title+=title_#叠加
                playbacknumber_=re.findall('<span title="观看" class="so-icon watch-num"><i class="icon-playtime"></i>\n        (.*?)\n      </span>',r.text)
                playbacknumber+=playbacknumber_
                uploadtime_=re.findall('<span title="上传时间" class="so-icon time"><i class="icon-date"></i>\n        (.*?)\n      </span>',r.text)
                uploadtime+=uploadtime_
                upname_=re.findall('class="up-name">(.*?)</a>',r.text)
                upname+=upname_
                url_=re.findall('<a title=".*?" href="(.*?)" target="_blank" class="title">',r.text)
                url+=url_
        #将链接补全
        url_in=[]
        for url_true in url:
            i= 'https:'+url_true
            url_in.append(i)
        text.insert(END, '保存成功正在生成表格...')
        data={'标题':title,'播放量':playbacknumber,'上传时间':uploadtime,'UP主':upname, '视频地址': url_in}
        y=pd.DataFrame(data)
        #下面浮点化数据方便作图(注意播放量单位带有”万“)
        for a,b in enumerate(y['播放量']):   
            if b[-1]=='万':
                y['播放量'][a]=float(y['播放量'][a][:-1])*10000
            else:
                y['播放量'][a]=float(y['播放量'][a])
        #下面建立excel文件
        y.to_excel('有关'+keyword+'的哔哩哔哩视频信息.xlsx',index=False)#制表
        y.plot(y='播放量',kind='hist')#制作直方图,要浮点化才能作图哦
        text.insert(END, '\n表格生成成功!')
    except:
        text.insert(END, '\n未获取到内容!')

tk.Button(zeaf, text='b站数据',command=get_bilibili).place(x=240,y=150)#加按钮,调用方法千万别加括号!!!

def get_lowiso():
    def save():#定义一个函数用来保存图片
        for url,name in zip(urls, names):  # 循环获取每一个图片网址和标题
            time.sleep(3)  # 设定3秒延时,太快会被检测
            response = requests.get(url, headers=user)  # 用requeste库的get函数访问图片网址,用headers进行伪装
            print("正在保存图片中……")
            with open('iso图片/'+name+'.jpg', 'wb') as f:  # 用wb模式打开创建文件,w写模式
                f.write(response.content)  # 写入二进制文件内容  
                
    if not os.path.exists('iso图片'):  # 判断文件夹是否存在,如果不存在:
        os.mkdir('iso图片')  # 创建一个文件夹
    user = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
    }
    response = requests.get('https://isorepublic.com/',headers=user)  # 用requests库的get函数访问总网页,用headers进行伪装,获得源码
    html = response.text  # 用文本显示访问网页得到的内容
    urls = re.findall('https://isorepublic.com/wp-content/uploads/.*?.jpg', html)  # 用正则表达式获得图片的所有网址
    names = re.findall('title="(.*?)" class=', html)  # 正则表达式创建图片名字
    if len(urls):#判断提取的地址是否为空
        save()
        print("保存第1页图片完毕!")
        for i in range(2,6): #循环输出2-99(实际上还不止100页)
            response = requests.get('https://isorepublic.com/page/'+str(i)+'/',headers=user)
            html = response.text  # 用文本显示访问网页得到的内容
            urls = re.findall('https://isorepublic.com/wp-content/uploads/.*?.jpg', html)
            names = re.findall('title="(.*?)" class=', html)
            if len(urls):
                save()
                print("保存第"+str(i)+"页图片完毕!")
            else:
                text.insert(END, '\n保存失败')
    else:
        text.insert(END, '\n保存失败')
    text.insert(END, '\n完毕!')
def get_highiso():
    def save():#定义一个函数用来保存图片
        for url,name in zip(urls,names):
            response = requests.get(url, headers=user)  # 用requeste库的get函数访问图片网址,用headers进行伪装
            with open('iso图片/'+name+'.jpg', 'wb') as f:  # 用wb模式打开创建文件,w写模式
                f.write(response.content)  # 写入二进制文件内容  
                f.close
                print('保存图片成功!')
    
    if not os.path.exists('iso图片'):  # 判断文件夹是否存在,如果不存在:
        os.mkdir('iso图片')  # 创建一个文件夹
    user = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
    }
    response = requests.get('https://isorepublic.com/',headers=user)  # 用requests库的get函数访问总网页,用headers进行伪装,获得源码
    html = response.text  # 用文本显示访问网页得到的内容
    urls_in = re.findall('<a href="(https://isorepublic.com/photo/.*?)" title=', html)  # 用正则表达式获得进入图片的所有网址
    if len(urls_in):#判断提取的网址是否为空
        for url_in in urls_in:#循环获取每一个图片的进入网址
            time.sleep(5)#快了GG
            response = requests.get(url_in,headers=user)#打开图片进入网址获取源码
            html = response.text
            urls = re.findall('<a href="(https://isorepublic.com/wp-content/uploads/.*?\.jpg)" title=', html)  # 用正则表达式获得图片的网址
            names = re.findall('.jpg" title="Download (.*?)"', html)  # 正则表达式创建图片名字
            if len(urls):
                save()#调用之前定义的函数保存
            else:
                print('获取图片网址失败!')
        print('保存第1页图片完毕!')
    else:
        print('获取进入网址失败!')        
    #获取多页内容
    for i in range(2,6):#循环输出2-99
        response = requests.get('https://isorepublic.com/page/'+str(i)+'/',headers=user)  # 用requests库的get函数访问总网页,用headers进行伪装,获得源码
        html = response.text  # 用文本显示访问网页得到的内容
        urls_in = re.findall('<a href="(https://isorepublic.com/photo/.*?)" title=', html)  # 用正则表达式获得进入图片的所有网址
        if len(urls_in):#判断提取的网址是否为空
            for url_in in urls_in:#循环获取每一个图片的进入网址
                time.sleep(5)#快了GG
                response = requests.get(url_in,headers=user)#打开图片进入网址获取源码
                html = response.text
                urls = re.findall('<a href="(https://isorepublic.com/wp-content/uploads/.*?\.jpg)" title=', html)  # 用正则表达式获得图片的网址
                names = re.findall('.jpg" title="Download (.*?)"', html)  # 正则表达式创建图片名字
                if len(urls):
                    save()#调用之前定义的函数保存
                else:
                    text.insert(END, '\n获取图片网址失败!')
            print('保存第'+str(i)+'页图片完毕!')
        else:
            text.insert(END, '\n获取进入网址失败!')
    text.insert(END, '\n完毕!')

tk.Button(zeaf, text='iso图片获取',command=get_lowiso).place(x=100,y=240)#加按钮,调用方法千万别加括号!!!
tk.Button(zeaf, text='iso高清图片',command=get_highiso).place(x=252,y=240)#加按钮,调用方法千万别加括号!!!
#tk.Menu(zeaf)
zeaf.mainloop()

其实有些运行过程会反映到右边这个text里...

其实有些运行过程会反映到右边这个text里...

总的界面示例

总的界面示例

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

天域至尊 发表于 2020-3-19 12:53
py打包会包含很多没用的东西进去,最好还是自己新建个虚拟环境,里面放的包放到最少。
我习惯用pyqt5了,加上Eric6 做个界面还是可以,但是环境部署简直难于上青天。
疾风怪盗 发表于 2020-3-19 11:14
一开始我也看得莫烦的视频学TK,但是太麻烦了,后来还是发现pyside2的图形界面设计QT Desiger比较方便,我最近也做了个小程序,一个主程序py,一个UI程序py,比较简单的文档处理,打包后大小36M
jemmshy 发表于 2020-3-16 21:40
 楼主| Zeaf 发表于 2020-3-16 21:46
cocococ 发表于 2020-3-16 21:44
代码占据了整个屏幕,但最吸引我的是楼主的签名

想来宁也是张三的粉丝了
zeknight 发表于 2020-3-16 22:45
打包真的会让人疯掉,最后发现还是用虚拟机安装上WIN7,python3.6,然后导入模块才顺利打包
 楼主| Zeaf 发表于 2020-3-17 09:11
zeknight 发表于 2020-3-16 22:45
打包真的会让人疯掉,最后发现还是用虚拟机安装上WIN7,python3.6,然后导入模块才顺利打包

主要是打包体积大啊
qwertyuiop1822 发表于 2020-3-17 10:39
做桌面小工具还是建议其他语言,Python打包不仅麻烦,还很大
 楼主| Zeaf 发表于 2020-3-17 10:46
qwertyuiop1822 发表于 2020-3-17 10:39
做桌面小工具还是建议其他语言,Python打包不仅麻烦,还很大

是这样的可是吧,我就学了这个当作做着玩吧
zeknight 发表于 2020-3-17 23:00
我觉得挺好,方便,我不在乎体积
 楼主| Zeaf 发表于 2020-3-18 09:00
zeknight 发表于 2020-3-17 23:00
我觉得挺好,方便,我不在乎体积

那也行吧其实装个环境也不要好久(相比于下载有可能几G的打包Python)
zeknight 发表于 2020-3-18 15:06
你不用全部导入吧,只用需要的模块就行了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 03:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表