• 开发环境:pyCharm ,win10
  • 开发语言:Python

使用python Tk做窗体应用程序,以及python多线程处理

主要实现功能爬取各大视频平台的视频的一个功能
首先先建一个TkinterUI.py 文件
插入如下代码(有些方法是未用到的,个人没有删代码的习惯,后面说不定留着有用)

import os
import threading
import tkinter as tk
from tkinter import *
from tkinter import messagebox
from tkinter import ttkfrom urllib3.connectionpool import xrange
from main import *def InitApp():print('程序启动')# 创建文件夹download_path = os.getcwd() + "/download/"if not os.path.exists(download_path):os.mkdir(download_path, 0o777)app = Application(tk.Tk())app.mainloop()class Application(ttk.Frame):process = Nonedef __init__(self, root):# 绑定窗口关闭事件root.protocol("WM_DELETE_WINDOW", self.on_closing)super().__init__(root)self.master = rootself.pack()self.url = StringVar(None, '')self.name = StringVar(None, '')self.trueUrl = StringVar(None, '')self.progress = StringVar(None, '0.00%')self.progressRate = DoubleVar(None, '0')self.speed = StringVar(None, '0.00MB/S')self.WindowAttributes(root)self.WindowContent()#退出事件def on_closing(self):print('程序退出事件')if messagebox.askokcancel("退出程序", "确定要退出吗?小老弟"):sys.exit()def WindowAttributes(self, root):root.resizable(False, False)root.title("视频播放器")self.update()# root.iconbitmap('favicon.ico')self.set_win_center(root, 700, 200)def WindowContent(self):frame0 = Frame(self)ttk.Label(frame0, text="视频链接地址:").pack(side="left")ttk.Entry(frame0, textvariable=self.url, width=61).pack(side='left')ttk.Button(frame0, text="播放视频", command=lambda: self.thread_it(self.resolveUrl)).pack(padx=10, side='left')frame0.grid(pady=10, sticky=W)frame1 = Frame(self)ttk.Label(frame1, text="视频名称:").pack(side='left')ttk.Entry(frame1, textvariable=self.name, width=20).pack(side='left')ttk.Label(frame1, text='下载地址:').pack(side='left')ttk.Entry(frame1, textvariable=self.trueUrl, width=34).pack(side='left')ttk.Button(frame1, text='下载视频', command=lambda: self.thread_it(self.downVideo)).pack(padx=10, side='left')frame1.grid(pady=10, sticky=W)frame2 = Frame(self)ttk.Label(frame2, text='下载进度:').pack(side='left')ttk.Label(frame2, textvariable=self.progress).pack(ipadx=50, side='left')ttk.Label(frame2, text='下载速度:').pack(side='left')ttk.Label(frame2, textvariable=self.speed).pack(side='left')ttk.Button(self, text='打开视频下载目录', command=lambda: self.thread_it(self.openExplorer)).place(x=510,y=100)frame2.grid(pady=10, sticky=W)frame3 = Frame(self)progress = ttk.Progressbar(frame3, length="610", variable=self.progressRate, mode="determinate",orient=tk.HORIZONTAL)progress.pack(side='left')frame3.grid(pady=10, sticky=W)def openExplorer(self):os.system("start explorer %s\download" % os.getcwd())def resolveUrl(self):_url = self.url.get()if _url == '' or _url == None:messagebox.showwarning('提示:', '请输入视频链接地址')return_trueUrl = getVideoUrl(_url)self.trueUrl.set(_trueUrl)def downVideo(self):name = self.name.get()if name == '' or name == None:messagebox.showwarning('提示:', '视频名称不能为空!')returnurl = self.trueUrl.get()if url == '' or url == None:messagebox.showwarning('提示:', '下载地址不能为空!')self.downloadFile(name + '.mp4', url)# 下载文件(文件名,下载地址)def downloadFile(self, name, url):headers = {'Proxy-Connection': 'keep-alive'}r = requests.get(url, stream=True, headers=headers)length = float(r.headers['content-length'])f = open(os.getcwd() + r'/download/' + name, 'wb')count = 0count_tmp = 0time1 = time.time()for chunk in r.iter_content(chunk_size=512):if chunk:f.write(chunk)count += len(chunk)if time.time() - time1 > 2:p = count / length * 100speed = (count - count_tmp) / 1024 / 1024 / 2count_tmp = countself.progress.set(formatFloat(p) + '%')self.speed.set(formatFloat(speed) + 'MB/S')self.progressRate.set(formatFloat(p))print(name + ': ' + formatFloat(p) + '%' + ' Speed: ' + formatFloat(speed) + 'M/S')time1 = time.time()f.close()self.progress.set('0.00%')self.progressRate.set('0')self.speed.set('0.00MB/S')messagebox.showinfo('提示:', '下载完成!')# 设置窗口居中def set_win_center(self, root, curWidth='', curHight=''):'''设置窗口大小,并居中显示:param root:主窗体实例:param curWidth:窗口宽度,非必填,默认200:param curHight:窗口高度,非必填,默认200:return:无'''if not curWidth:'''获取窗口宽度,默认200'''curWidth = root.winfo_width()if not curHight:'''获取窗口高度,默认200'''curHight = root.winfo_height()# print(curWidth, curHight)# 获取屏幕宽度和高度scn_w, scn_h = root.maxsize()# print(scn_w, scn_h)# 计算中心坐标cen_x = (scn_w - curWidth) / 2cen_y = (scn_h - curHight) / 2# print(cen_x, cen_y)# 设置窗口初始大小和位置size_xy = '%dx%d+%d+%d' % (curWidth, curHight, cen_x, cen_y)root.geometry(size_xy)# 多线程任务def thread_it(self, func, *args):'''将函数打包进线程'''# 创建t = threading.Thread(target=func, args=args)# 守护 !!!t.setDaemon(False)# 启动t.start()# 阻塞--卡死界面!# t.join()def AppMain():InitApp()# getVideoUrl()AppMain()

然后再建一个简单的处理类 main.py

import os
import re
import time
import urllibimport requests
from selenium import webdriver
from tkinter import ttk
from bs4 import BeautifulSoup
import unittest
#打包时添加
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)  # 去掉ssl烦人的警告def getVideoUrl(url):print('正在解析...')#打开浏览器(不弹出浏览器页面)try:#隐藏浏览器option = webdriver.ChromeOptions()# option.add_argument('headless')# driver = webdriver.Chrome(chrome_options=option)# 1.新版本谷歌浏览器-解决控制提示option.add_experimental_option("useAutomationExtension", False)option.add_experimental_option("excludeSwitches", ['enable-automation'])# 2.旧版本浏览器-解决控制提示(待测试)#option.add_argument('disable-infobars')driver = webdriver.Chrome(chrome_options=option)except:print('谷歌浏览器启动失败!正在切换Mdge浏览器...')try:driver = webdriver.Edge()except:print('Edge浏览器启动失败!请联系开发者')return#打开浏览器#driver = webdriver.Chrome()#最大化浏览器#driver.maximize_window()#打开页面#videoUrl='https://www.iqiyi.com/v_19rsxd4hwg.html'videoUrl = urldriver.get("http://vip.52jiexi.top/?url="+videoUrl)respone=requests.get('http://vip.52jiexi.top/?url='+videoUrl)#正则表达获取,iframe的地址print(respone.text)iframe=driver.find_element_by_class_name('iframeStyle')iframeSrc=re.search(r'src="(.*)" class', respone.text).group(1)#iframeSrc= iframe.get_attribute('src')print('iframeSrc:'+iframeSrc)#iframUrl=re.findall('<ifram src="(.*)">',respone.text)#print(iframUrl[0].group(1))#通过contains函数,提取匹配特定文本的所有元素frame = driver.find_element_by_xpath("//iframe[contains(@src,'"+iframeSrc+"')]")#进入iframe页面driver.switch_to.frame(frame)div=driver.find_element_by_id('player')video= div.find_element_by_id('video')trueUrl=video.get_attribute('src')print(trueUrl)#downloadPath=os.getcwd()+r'/download/text.mp4'return  trueUrl#downloadFile('陈翔六点半之民间高手.mp4',url)# 下载文件-urllib.request
def getDown_urllib(url, file_path):try:urllib.request.urlretrieve(url, filename=file_path)return Trueexcept urllib.error.URLError as e:# hasttr(e, 'code'),判断e 是否有.code属性,因为不确定是不是HTTPError错误,URLError包含HTTPError,但是HTTPError以外的错误是不返回错误码(状态码)的if hasattr(e, 'code'):print(e.code)  # 打印服务器返回的错误码(状态码),如403,404,501之类的elif hasattr(e, 'reason'):print(e.reason)  # 打印错误原因def formatFloat(num):return '{:.2f}'.format(num)

接着还有一个重要的东西
程序中需要用到chromediver.exe 和MicrosoftWebDriver.exe 这个东西需要根据自己的浏览器下载不同的版本放到程序根目录下
chromediver.exe 下载:https://npm.taobao.org/mirrors/chromedriver/
下载的版本怎么看,如下图,关于chrome里面可见 88.04324

MicrosoftWebDriver.exe 下载地址:(看版本原理同chrome)
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

运行效果图

最后放一张我整个项目的目录(有些东西是自动生成的)

源码下载:https://download.csdn.net/download/baidu_39105563/14900592
本人所有博客中所发布的资源文件一律免费

使用python tkinter做window窗体界面程序,以及python多线程处理解决tk界面卡死相关推荐

  1. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  2. 使用Python Tkinter的年龄计算器应用程序

    如果您想使用Tkinter创建美观的应用程序,那么您来对地方了.在本文中,让我们使用Python的Tkinter库创建一个年龄计算器应用程序. 在这个年龄计算器应用程序中,用户可以输入他们的出生日期, ...

  3. |python|用tkinter做minecraft启动器 第一章:python配置

    哈啰啊,这是发的第一篇文章,做的不好,多多关照 好进入正题今天是配置python,先看后期的图片 好,我们首先得下载python(链接加载有点慢) python下载 | 传送门 | 然后点这个(红框框 ...

  4. Python tkinter 做水果超市!

    今天教大家做python tkinter 弹窗水果超市 , 非常好用 ! import tkinter as tk from tkinter import ttk win = tk.Tk() win[ ...

  5. python+ tkinter做的一个项目辅助测试工具

    python+tkinter 写的一个项目测试工具 目的是能够自动按照模板向禅道系统 提交bug,自动打包日志并上传到禅道上 以及结合进 项目中一些其他的功能,提升测试效率 主要是记录下 tkinte ...

  6. python视频教程黑马-python视频教程免费:求黑马程序员python教程?

    python后端开发需要学什么? 第一阶段:Python语言基础 主习Python最基识,如Python3.数据类型.字符串.函数.类件操作等.阶段课程结束后,学员需要完成Pygame实战飞机大战.2 ...

  7. 学python可以做什么职业-不知道学了Python能干嘛?Python职业发展:7大职位供你选择!...

    原标题:不知道学了Python能干嘛?Python职业发展:7大职位供你选择! 为什么那么多小伙伴都在学Python呢?Python到底有啥魔力?学了Python都能干啥?这篇文章,肉丝儿来和大家一起 ...

  8. python可以做什么工作好-学完Python我们可以做什么工作?

    Python是人工智能首选语言,相信对Python有一定了解的朋友们都知道这个问题,但是在人工智能还没有真正实现的现在,学习Python编程语言我们可以做哪些工作呢?现在学习Python好就业吗? P ...

  9. 学python可以做什么职业好-业余学Python能做什么?对职业发展有什么帮助?

    业余学Python能做什么?一般来说,Python有Web开发.数据科学和脚本三大应用.无论对于零基础小白,还是已经工作想要提升自己的在职人员,学好这些内容都会对职业发展有着重要作用.下面小编将详细为 ...

最新文章

  1. linux下ssh文件配置,允许root远程用密码登录
  2. el表达式大小写问题的坑坑坑坑坑坑坑坑!!!
  3. 小cookie,大智慧
  4. 软件与软件工程的概念
  5. 应用程序错误代码0xe06d7363怎么解决
  6. kafka-3-故障排错
  7. open cv+C++错误及经验总结(十二)
  8. SPOOLing技术的再思考
  9. interpeter用python还是pythonw_python-interpreter
  10. Dubbo2.7源码分析-如何发布服务
  11. ArcGIS 安装出现Mircrosoft .NET Framework 3.5 sp1问题的解决方案
  12. [Mysql]InnoDB数据页结构(掘金小册阅读笔记)
  13. linux 通过ln -s建立链接文件后,如何通过链接文件查看源文件
  14. Java Mail 发送邮件126、163 、QQ
  15. GDC API下载肿瘤数据
  16. JAVA入门-024(int的正负数)
  17. 企业信息化投入中咨询服务_咨询服务企业如何实施项目核算信息化建设
  18. Batch Normation
  19. navicat的基本使用技巧
  20. js中动态给img标签添加onclick事件

热门文章

  1. mybatis判断字符串为空或者空字符串
  2. github收不到短信怎么办
  3. 2019年度江苏省守信用重合同企业申请条件
  4. 视频怎么进行剪切,一个视频怎么分成两个
  5. TCP SACK panic漏洞的解释和思考
  6. 自定义字体(中英文字体合并)
  7. 前端转战JAVA——0928
  8. oracle中常见ck和fk是什么,oracle知识整理
  9. 计算机组成原理(第2版)唐朔飞
  10. matlab时间字符串相减,Matlab中时间字符串处理总结