解析qq57240的top250文件,生成excel表格,方便统计哪些没有下载过

一:目的

在github上发现了一个好项目,整理出了某个热门网站里的排名。免费会员看不到,花钱又太贵。
下过来的是md文件,用于这个小工具生成excel文件后,跟本地torrent文件作比较,看看哪些没有下载过。
md文件格式如下,统计不是很方便。
在这里插入图片描述

二: 版本更新

V1.03
  1、为解决在执行过程中卡死的问题,把md文件解析函数、代理测试函数,放到了线程里
  2、在执行过程中,禁止了其他控件的操作

V1.02
  为解决太慢的问题,增加了代理功能

V1.01
  增加在线爬磁力、演员列表

V1.00
  仅解析md文件内容,并生成excel文件

三: 工具使用

左侧是过滤列表,用于想排除或者想要的,根据选项使用黑名单或白名单模式。右侧是当前目录下的md文件列表。
可以从原始URL中获取磁力链接的功能,并顺便解析出参演名单列表。
具备代理设置选项以及超时和重试设置,利用google、facebook、twitter测试代理是否可用。
在这里插入图片描述

四:生成的excel文件展示

根据md文件生成方便统计的excel表格。其实呢这里还可以再做的深入一些,例如:
1、直接搜索指定目录,查找重复(已下载)的文件,自动排除掉。省去了手动排除已有文件的步骤。由于大家需求不同,这个没有加进来,后面也不打算集成进来了。用专门的小脚们去排查那些已有的。
2、演员改名字了的话,这个还没想好要怎么样处理。
在这里插入图片描述

五:代码

#依赖以下库,未安装的使用下面的命令安装
#pip install beautifulsoup4     //Html解析
#pip install lxml               //Html解析
#pip install pandas             //excel表格处理
#pip install requests           //网页请求
#pip install tk                 //可视化界面
#pip install comtypes           //通信类型
#pip install pywifi             //WiFi库

import platform
import os                   #系统操作、文件夹操作等
import re
import pandas as pd         #若没有则使用命令
import tkinter.filedialog   #文件打开对话框
#import windnd              #文件拖拽使用,需安装windnd
import webbrowser           #点击超链接打开浏览器需要这个
import requests             #请求web数据
import time
import pywifi               #扫描wifi用
import threading            #开线程,不让界面程卡死状态

from tkinter import *
from tkinter import ttk                         #下拉菜单使用
from tkinter.ttk import Progressbar             #进度条
from tkinter.scrolledtext import ScrolledText   #带滚动条的文本输入控件
from requests.adapters import HTTPAdapter       #重试次数
from ctypes import *
from sys import version                         #获取系统版本
from bs4 import BeautifulSoup                   #解析html用这个


global Filter_list_textbox
global AllFile_list_textbox
global AllFileList
global AllFileList_bak

versionStr = 'JavdbTop250导出excel V1.03'

AllFileList = []
AllFileList_bak = []
filter_list = ['test.md', 'readme.md', 'censored.md', 'fc2.md', 'uncensored.md', 'western.md']
filter_type = ['黑名单模式-单个 (一个md文件生成一个xlsx)', '黑名单模式-汇总 (所有md文件生成汇总xlsx)', '白名单模式-单个 (一个md文件生成一个xlsx)', '白名单模式-汇总 (所有md文件生成汇总xlsx)']

AV_dict = {}

def print_Welcomeinfo():
    print(' ______________________________________________________________________________ ')
    print('|                                                                              |')
    print('|                               基于这个版本                                   |')
    print('|          Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54)           |')
    print('|                    [MSC v.1924 64 bit (AMD64)] on win32                      |')
    print('|                                                                              |')
    print('|  注1:请勿在公司使用,除非公司不审查流量                                     |')
    print('|  注2:Check_Wifi_SSID()函数是通过wifi名称判断是不是在公司                    |')
    print('|  注3:从.md文件解析出网址,再从网址里面爬出磁力链接和演员列表                |')
    print('|  注4:随手写的,不关注条理性、效率                                           |')
    print('|______________________________________________________________________________|\n\n')
    return 0

#无线网SSID检查,毕竟有的公司对外网链接审查非常严格。这里还是主动判一下是不是在公司。
#当然,有线网就没办法了,自己注意吧。
def Check_Wifi_SSID():
    if Parse_VideoCode_val.get()==1 or Parse_actors_val.get()==1 or Parse_magnet_val.get()==1:
        Wifi_Blacklist = ['fang', 'sf', 'staff']

        wifi = pywifi.PyWiFi()              #抓取网卡接口
        ifaces = wifi.interfaces()[0]       #获取无线网卡
        profile = ifaces.scan_results()[0]  #获取无线网卡信息
        ssid = profile.ssid.lower()         #获取名字
        
        for Blacklist in Wifi_Blacklist:
            if Blacklist in ssid:
                return 'forbid'
    return 'allow'


#debug打印用
def debug_print_FileList(lists,flag):
    print('============',flag,'============')
    for item in lists:
        print(item)
    return 0


#获取文件夹中的.md文件
def GetMDFileList(FolderPath):
    global AllFileList
    global AllFile_list_textbox
    AllFileList.clear()
    
    files = os.listdir(FolderPath)
    
    for file in files:
        if os.path.isfile(os.path.join(FolderPath, file)):
            if os.path.splitext(file)[-1] == '.md':
                AllFileList = AllFileList+[file]
    Init_file_list_text(AllFile_list_textbox, AllFileList)
    return AllFileList


#初始化文件列表显示文本框
def Init_file_list_text(filter_file_textbox,file_list):
    filter_file_textbox.delete(1.0, END)
    for item in file_list:
        text = item+'\n'
        filter_file_textbox.insert(END,text)
    return 0


#刷新.md文件展示文本框
def Renew_file_List_text(filename):
    global AllFile_list_textbox
    global AllFileList_bak

    state = AllFile_list_textbox['state']
    if state == 'disabled': #DISABLED
        AllFile_list_textbox.config(state='normal')

    if filename in AllFileList_bak:
        n = AllFileList_bak.index(filename)
        AllFileList_bak[n] = filename+' [√]'
        Init_file_list_text(AllFile_list_textbox, AllFileList_bak)
    
    if state == 'disabled': #DISABLED == 'disabled'
        AllFile_list_textbox.config(state='disabled')
    top.update()
    return 0


#从文件过滤文本框中获取文件列表
def Get_filter_list_text(filter_file_ScrolledText):
    #list.remove()一次只能删除一个,不好用
    FileList = filter_file_ScrolledText.get(1.0,'end')
    FileList = FileList.split('\n')
    Files=[]
    for file in FileList:
        if '' != file:
            Files.append(file)
    return Files
    
    
#打开目录窗口
def OpenFolder():
    default_path=Folder_value.get()
    FileName_t  = tkinter.filedialog.askdirectory(initialdir=default_path)    #取消后是返回一个空字符串
    if not FileName_t:
        #Folder_value.set(os.getcwd())
        print("未选择文件")
    else:
        Folder_value.set(FileName_t)
        GetMDFileList(FileName_t)
        #print(files)
    return FileName_t


Javdb_Top250 = 'https://github.com/qq57240/Javdb-Top250'

# 此处必须注意,绑定的事件函数中必须要包含event参数
def open_url(event):
    webbrowser.open(Javdb_Top250, new=0)


#解析.md文件
#按行读取,'Tag:','elease Date:','Title:'作为一组。
#读到'Title:'行的时候,打开URL去抓里面的磁力链接
def Parse_MDfile(mdfile_path):
    global AV_dict
    Num = 1
    file=open(mdfile_path, 'r',encoding='UTF-8')

    AV_num=''
    AV_date=''
    AV_actors=''
    AV_title=''
    AV_url=''
    
    vediocode_parse=''  #从URL解析出的番号
    actors_parse=[]     #从URL解析出的演员列表
    magnetlink_parse='' #从URL解析出的磁力链接

    for line in file:
        string = line.strip()
        str_pat1 = re.compile(r'\"(.*?)\"')  #正则表达式,取""之间的字符串 part1
        str_pat2 = re.compile(r'\[(.*?)\]')  #正则表达式,取[]之间的字符串 part1
        str_pat3 = re.compile(r'\((.*?)\)')  #正则表达式,取()之间的字符串 part1

        if "Tag: " in string:   ##番号
            splitext = string.split(': ')   #注意这里有空格
            AV_num = splitext[1].replace('<br>','')
            pass
        if "Release Date: " in string:  ##日期
            splitext = string.split(': ')   #注意这里有空格
            AV_date = splitext[1].replace('<br>','')
            pass
        if "Title: " in string:     ##标题和链接
            splitext = string.split(': ',1)   #注意这里有空格
            AV_title  = str_pat2.findall(splitext[1])[0]    #正则表达式,取[]之间的字符串 part2
            splitext = string.split(']',1)
            AV_url  = str_pat3.findall(splitext[1])[0]  ##正则表达式,取()之间的字符串 part2
            
            #番号、演员、磁力,任意一个都勾选的话
            if Parse_VideoCode_val.get()==1 or Parse_actors_val.get()==1 or Parse_magnet_val.get()==1:
                vediocode_parse, actors_parse, magnetlink_parse = Get_VideoCode_actors_magnet('remote', AV_url)
            
            #如果勾选解析演员
            if Parse_actors_val.get()==1:
                AV_actors = '&'.join(actors_parse)  #将人名用&串起来形成一个字符串
                
            #如果勾选解析磁力
            if Parse_magnet_val.get()==1 and magnetlink_parse != '':
                AV_url = magnetlink_parse
                print(Num, AV_num, AV_url)
            elif Parse_magnet_val.get()==1 and magnetlink_parse == '':
                print(Num, AV_num, '无磁力链接')
            
            AV_dict[AV_num] = [AV_actors, AV_date, AV_url, AV_title]
                
            AV_num=''
            AV_actors=''
            AV_date=''
            AV_title=''
            AV_url=''
            
            progressbar1['value'] = Num #写进度条的值
            top.update()                #整个界面强制刷新,为了进度条刷新
            Num = Num + 1
    file.close()
    return 0

#将获取到的所有数据保存到excel中
def Creat_excel(AV_dict, excelfile_path):
    df1 = pd.DataFrame.from_dict(AV_dict,orient='index',columns=['演员', '日期','URL','标题'])  #番号列作为索引了
    writer = pd.ExcelWriter(excelfile_path)
    df1.to_excel(excelfile_path)
    return 0


#一个md生成一个excel文件。黑名单模式
def OneFile_Blacklist(src_folder, excelFolderName, file_list):
    des_path = os.path.join(src_folder, excelFolderName)
    if not os.path.exists(des_path):
        os.makedirs(des_path)
    for root, dirs, files in os.walk(src_folder):
        for file in files:
            if file.lower() in file_list:
                continue
            if os.path.splitext(file)[1].lower() == '.md':
                print(file)
                Parse_MDfile(os.path.join(src_folder,file))
                Renew_file_List_text(file)
                des_file = os.path.join(des_path, file+'.xlsx')
                Creat_excel(AV_dict, des_file)
                AV_dict.clear()
        break  #只解析当前目录,不递归解析子目录
    return 0


#所有md文件,生成‘汇总.xlsx’。黑名单模式
def AllFile_Blacklist(src_folder, excelFolderName, file_list):
    des_path = os.path.join(src_folder, excelFolderName)
    if not os.path.exists(des_path):
        os.makedirs(des_path)
    for root, dirs, files in os.walk(src_folder):
        for file in files:
            if file.lower() in file_list:
                continue
            if os.path.splitext(file)[1].lower() == '.md':
                print(file)
                Parse_MDfile(os.path.join(src_folder,file))
                Renew_file_List_text(file)
        break
    des_file = os.path.join(des_path, '汇总.xlsx')
    Creat_excel(AV_dict, des_file)
    AV_dict.clear()
    return 0

#一个md生成一个excel文件。白名单模式
def OneFile_Whitelist(src_folder, excelFolderName, file_list):
    des_path = os.path.join(src_folder, excelFolderName)
    if not os.path.exists(des_path):
        os.makedirs(des_path)
    for root, dirs, files in os.walk(src_folder):
        for file in files:
            if file.lower() in file_list:
                print(file)
                Parse_MDfile(os.path.join(src_folder,file))
                Renew_file_List_text(file)
                des_file = os.path.join(des_path, file+'.xlsx')
                Creat_excel(AV_dict, des_file)
                AV_dict.clear()
        break
    return 0


#所有md文件,生成‘汇总.xlsx’。白名单模式
def AllFile_Whitelist(src_folder, excelFolderName, file_list):
    des_path = os.path.join(src_folder, excelFolderName)
    if not os.path.exists(des_path):
        os.makedirs(des_path)
    for root, dirs, files in os.walk(src_folder):
        for file in files:
            if file.lower() in file_list:
                print(file)
                Parse_MDfile(os.path.join(src_folder,file))
                Renew_file_List_text(file)
        break
    des_file = os.path.join(des_path, '汇总.xlsx')
    Creat_excel(AV_dict, des_file)
    AV_dict.clear()
    return 0

#解析主入口
def CreatExcel_event():
    global AllFileList
    global AllFileList_bak
    
    #一上来就先判是否解析URL,如果解析URL的话,是否是链接的公司wifi
    if Check_Wifi_SSID() == 'forbid':
        print('此Wifi被禁止联网解析,更换AP')
        return 0
    
    AllFileList_bak = AllFileList.copy()
    Init_file_list_text(AllFile_list_textbox, AllFileList_bak)
    
    Disable_all_control() #执行期间,禁止操作其他控件
    
    
    des_folder = 'EXCEL导出'
    src_path = Folder_value.get()
    files = Get_filter_list_text(Filter_list_textbox)
    CreatType = comb_CreatType.get()
        
    if CreatType == filter_type[0]:     #'黑名单模式-单个 (一个md文件生成一个xlsx)'
        OneFile_Blacklist(src_path, des_folder, files)
        pass
    if CreatType == filter_type[1]:     #'黑名单模式-汇总 (所有md文件生成汇总xlsx)'
        AllFile_Blacklist(src_path, des_folder, files)
        pass
    if CreatType == filter_type[2]:     #'白名单模式-单个 (一个md文件生成一个xlsx)'
        OneFile_Whitelist(src_path, des_folder, files)
        pass
    if CreatType == filter_type[3]:     #'白名单模式-汇总 (所有md文件生成汇总xlsx)'
        AllFile_Whitelist(src_path, des_folder, files)
        pass
    Reset_all_control() #执行结束后,恢复其他控件
    return 0

#调试用,保存请求到的html
def SaveHtmlFile(HtmlPath, HtmlData):
    HtmlFile = open(HtmlPath, 'w',encoding='utf-8')
    HtmlFile.write(HtmlData)
    HtmlFile.close()
    return 0

#从设置框里获取代理配置
def Get_ProxySetting():
    ProxySetting = {}
    ProxyType = ProxyType_comb.get()
    ProxyIP   = ProxyIP_Entry.get()
    ProxyPort = ProxyPort_Entry.get()
    ProxySetting['http']='%s://%s:%s'%(ProxyType,ProxyIP,ProxyPort)
    ProxySetting['https']='%s://%s:%s'%(ProxyType,ProxyIP,ProxyPort)
    return ProxySetting

#请求网页,返回html数据
def GetHtml(URL):
    html = None
    ProxySettings = {}
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'}
    max_retry = int(RetryNum_label_Entry.get(),10)+1   #重试次数
    timeout_s = int(timeout_label_Entry.get(),10)   #超时时间

    #####设置requests最大重试次数
    htmlget = requests.Session()
    htmlget.mount('http://', HTTPAdapter(max_retries=max_retry-1))      ##设置http链接最大重试次数
    htmlget.mount('https://', HTTPAdapter(max_retries=max_retry-1))     ##设置https链接最大重试次数

    if ProxyEnable_val.get() == 1:
        ProxySettings = Get_ProxySetting()
    else:
        ProxySettings = None

    if Debug_val.get() == 1:
        print(ProxySettings)
    try:
        html = htmlget.get(URL, headers=headers, timeout=timeout_s, proxies = ProxySettings).content.decode('utf-8')
    except:
        html = None
    return html

#【代理测试】按钮调用,用3个必须搭梯子访问的网址进行测试
def ProxyTest():
    Disable_ProxySetting_All()
    URL_LIST = ['https://www.google.com.hk', 'https://www.facebook.com', 'https://twitter.com']
    for URL in URL_LIST:
        html = GetHtml(URL)
        if html != None:
            print('代理连接正常',URL)
        else:
            print('代理连接失败',URL)
    Reset_ProxySetting_All()
    return 0

#从html中获取磁力链接
def Get_magnet(SoupData):
    magnet_link=''

    magnet_node = SoupData.find('div', attrs={'class':'item columns is-desktop odd'})
    if magnet_node == None:
        #magnet_node = SoupData.find(class_="item columns is-desktop ")
        magnet_node = SoupData.find('div', attrs={'class':'item columns is-desktop'})
    
    if magnet_node != None:
        if 'href' in magnet_node.a.attrs:
            #print('磁力链接',magnet_node.a['href'])
            magnet_link = magnet_node.a['href']
        else:
            if Debug_val.get() == 1:
                print('\t\t无href属性')
            pass
    else:
        if Debug_val.get() == 1:
            print('\t\t无演员标签')
        pass
    return magnet_link

#从html中获取演员列表,NotFound是未找到时的默认返回值
def Get_actors(SoupData,NotFound): 
    actors_list=[]

    actors_nodes = SoupData.find_all(class_="symbol female") #找到所有女演员标记
    if actors_nodes == None:
        return [NotFound]
    for actors_node in actors_nodes:
        actors_previous_node = actors_node.previous_sibling     #返回前一个节点
        actors = actors_previous_node                           #前一个节点就是<a href="...."> </a>
        actors_list.append(actors.get_text())
    return actors_list

#从html中获取番号,NotFound是未找到时的默认返回值
def Get_video_codes(SoupData, NotFound):
    video_codes=''
    video_codes_copy_button = SoupData.find('a', attrs={'class':'button is-white copy-to-clipboard'})
    if video_codes_copy_button == None:
        return NotFound
    video_codes = video_codes_copy_button.get('data-clipboard-text')
    return video_codes

'''
远程模式 Get_VideoCode_actors_magnet('remote', 'https://javdb008.com/v/55aEz')
本地HTML Get_VideoCode_actors_magnet('local',  'CAWD-386.html')
'''
#从html中获取番号、演员列表、磁力链接
#番号其实不是必要的,在md文件中已经有了,这里是为了调试,在保存html文件的时候要用一下,所以顺便解出番号
def Get_VideoCode_actors_magnet(RemoteMode,URL):
    htmlData = None
    vedio_code = ''
    magnet_link=''
    actors_list=[]
    soup = None
    
    if RemoteMode == 'remote': #远程模式
        htmlData = GetHtml(URL)
        if htmlData != None:
            soup = BeautifulSoup(htmlData,features="lxml")
    else:           #本地html
        soup = BeautifulSoup(open(URL,encoding='utf-8'), features="lxml")
    
    if soup != None:
        vedio_code = Get_video_codes(soup, '异常')
        magnet_link = Get_magnet(soup)
        actors_list = Get_actors(soup, '异常')
        if Debug_val.get() == 11111:
            if RemoteMode == 'remote': #远程模式
                if htmlData != None:
                    print('写\'%s.html\''%vedio_code)
                    SaveHtmlFile('%s.html'%vedio_code, htmlData)

    if Debug_val.get() == 1:
        print("番号", vedio_code)
        print("演员", actors_list)
        print("磁力", magnet_link)
    return vedio_code,actors_list,magnet_link

#初期给总开关预留的功能,现在已经没有用了
#当总开关未勾选时,这3个复选框是禁止编辑状态
#当总开关勾选时,这3个复选框是允许编辑状态
def Init_ParseCheckButton_Group():
    if ParseCheck_val.get() == 1:
        Parse_actors_Button.config(state='normal')    #解析演员正常编辑
        Parse_VideoCode_Button.config(state='normal') #解析番号正常编辑
        Parse_magnet_Button.config(state='normal')    #解析磁力正常编辑
    else:
        Parse_actors_Button.config(state='disabled')    #解析演员禁止编辑
        Parse_VideoCode_Button.config(state='disabled') #解析番号禁止编辑
        Parse_magnet_Button.config(state='disabled')    #解析磁力禁止编辑
    return 0

#代理总开关,修改代理类型下拉框、IP地址文本框、IP端口文本框、代理测试按钮的状态
def Init_ProxySetting_group():
    if ProxyEnable_val.get() == 1:   #如果启用代理
        ProxyType_comb.config(state='readonly') #代理类型下拉框  可操作,但文本只读
        ProxyIP_Entry.config(state='normal')      #IP地址输入框    正常操作
        ProxyPort_Entry.config(state='normal')    #端口号输入框    正常操作
        ProxyTest_btn.config(state='normal')      #测试按钮        正常操作
    else:
        ProxyType_comb.config(state='disabled')   #代理类型下拉框  禁止操作
        ProxyIP_Entry.config(state='disabled')    #IP地址输入框    禁止操作
        ProxyPort_Entry.config(state='disabled')  #端口号输入框    禁止操作
        ProxyTest_btn.config(state='disabled')    #测试按钮        禁止操作
    return 0


#所有代理相关的禁止操作
def Disable_ProxySetting_All():
    ProxyEnable_Button.config(state='disabled')   #测试按钮        禁止操作
    ProxyType_comb.config(state='disabled')       #代理类型下拉框  禁止操作
    ProxyIP_Entry.config(state='disabled')        #IP地址输入框    禁止操作
    ProxyPort_Entry.config(state='disabled')      #端口号输入框    禁止操作
    ProxyTest_btn.config(state='disabled')        #测试按钮        禁止操作
    timeout_label_Entry.config(state='disabled')      #超时时间
    RetryNum_label_Entry.config(state='disabled')     #重试次数
    return 0
    
#所有代理相关的禁止操作
def Reset_ProxySetting_All():
    ProxyEnable_Button.config(state='normal')   #测试按钮        恢复操作
    timeout_label_Entry.config(state='normal')      #超时时间
    RetryNum_label_Entry.config(state='normal')     #重试次数
    Init_ProxySetting_group()
    return 0

def Disable_all_control():
    FolderPath_text.config(state='disabled')          #文件夹路径显示框
    OenFolder_btn.config(state='disabled')            #打开目录按钮
    comb_CreatType.config(state='disabled')           #模式选择下拉菜单
    CreatExcel_btn.config(state='disabled')           #解析文件按钮
    ProxyEnable_Button.config(state='disabled')       #代理开关
    ProxyType_comb.config(state='disabled')           #代理类型:下拉菜单
    ProxyIP_Entry.config(state='disabled')            #代理地址:单行文本框
    ProxyPort_Entry.config(state='disabled')          #代理端口
    ProxyTest_btn.config(state='disabled')            #测试按钮
    #timeout_label_Entry.config(state='disabled')      #超时时间
    #RetryNum_label_Entry.config(state='disabled')     #重试次数
    ChangeDomain_label_Entry.config(state='disabled') #替换网址
    Parse_VideoCode_Button.config(state='disabled')   #解析番号
    Parse_actors_Button.config(state='disabled')      #解析演员名
    Parse_magnet_Button.config(state='disabled')      #解析磁力链接
    Debug_Button.config(state='disabled')             #Debug开关
    Filter_list_textbox.config(state='disabled')      #文件过滤展示框
    AllFile_list_textbox.config(state='disabled')     #文件夹内的文件展示
    return 0
    

def Reset_all_control():
    FolderPath_text.config(state='normal')          #文件夹路径显示框
    OenFolder_btn.config(state='normal')            #打开目录按钮
    comb_CreatType.config(state="readonly")       #模式选择下拉菜单
    CreatExcel_btn.config(state='normal')           #解析文件按钮
    ProxyEnable_Button.config(state='normal')       #代理开关
    #ProxyType_comb.config(state="readonly")       #代理类型:下拉菜单
    #ProxyIP_Entry.config(state='normal')            #代理地址:单行文本框
    #ProxyPort_Entry.config(state='normal')          #代理端口
    #ProxyTest_btn.config(state='normal')            #测试按钮   Init_ProxySetting_group() #初始化代理相关控件的状态
    #timeout_label_Entry.config(state='normal')      #超时时间
    #RetryNum_label_Entry.config(state='normal')     #重试次数
    ChangeDomain_label_Entry.config(state='normal') #替换网址
    Parse_VideoCode_Button.config(state='normal')   #解析番号
    Parse_actors_Button.config(state='normal')      #解析演员名
    Parse_magnet_Button.config(state='normal')      #解析磁力链接
    Debug_Button.config(state='normal')             #Debug开关
    Filter_list_textbox.config(state='normal')      #文件过滤展示框
    AllFile_list_textbox.config(state='normal')     #文件夹内的文件展示
    Init_ProxySetting_group()
    return 0

def Thread_creat(func):
    '''将函数打包进线程'''
    t = threading.Thread(target=func)  # 创建
    t.setDaemon(True) # 守护 !!!
    t.start() # 启动
    # 阻塞--卡死界面!
    # t.join()

print_Welcomeinfo()

OS = platform.system()

top = Tk()
top.title(versionStr)
top.resizable(False, False) #禁止调整窗口大小
top.geometry("480x500")

link = Label(text=Javdb_Top250, fg='blue', anchor='center',relief=GROOVE)
link.place(x=1, y=0, width=479, height=25)
link.bind("<Button-1>", open_url)   #绑定label单击事件

#文件夹路径显示框
Folder_value = StringVar()
Folder_value.set(os.getcwd()) #初始化成当前.py文件所在目录
FolderPath_text = Entry(relief="solid", textvariable = Folder_value)
FolderPath_text.place(x=1, y=25, width=418, height=24)

#打开目录按钮
OenFolder_btn = Button()
OenFolder_btn.config(text='打开目录', command=OpenFolder)
OenFolder_btn.place(x=420, y=25, width=59, height=24)

#模式选择下拉菜单
comb_CreatType = ttk.Combobox(state="readonly")
comb_CreatType.place(x=1, y=50, width=418, height=24)
comb_CreatType['value'] = (filter_type[0],filter_type[1],filter_type[2],filter_type[3])
comb_CreatType.current(2)

#解析文件按钮
CreatExcel_btn = Button()
#CreatExcel_btn.config(text='解析文件', command=CreatExcel_event)
CreatExcel_btn.config(text='解析文件', command=lambda:Thread_creat(CreatExcel_event))
CreatExcel_btn.place(x=420, y=50, width=59, height=24)

#代理开关
ProxyEnable_val = IntVar()
ProxyEnable_val.set(0)
ProxyEnable_Button = Checkbutton(top, text = "启用代理", anchor='w', relief='groove', variable = ProxyEnable_val, onvalue=1, offvalue=0, command=Init_ProxySetting_group)
ProxyEnable_Button.place(x=1, y=75, width=479, height=29)

#代理类型:下拉菜单
ProxyType_comb = ttk.Combobox(state="readonly")
ProxyType_comb.place(x=124, y=77, width=70, height=24)
ProxyType_comb['value'] = ('http','https','socks4','socks5')
ProxyType_comb.current(0)

#代理地址:单行文本框
ProxyIP_text = StringVar()
ProxyIP_text.set('127.0.0.1')
ProxyIP_Entry = Entry(textvariable = ProxyIP_text)
ProxyIP_Entry.place(x=195, y=77, width=174, height=24)

#代理端口
ProxyPort_text = StringVar()
ProxyPort_text.set('7890')
ProxyPort_Entry = Entry(textvariable = ProxyPort_text)
ProxyPort_Entry.place(x=369, y=77, width=50, height=24)

#测试按钮
ProxyTest_btn = Button()
#ProxyTest_btn.config(text='代理测试', command=ProxyTest)
ProxyTest_btn.config(text='代理测试', command=lambda:Thread_creat(ProxyTest))
ProxyTest_btn.place(x=420, y=77, width=59, height=24)

Init_ProxySetting_group() #初始化代理相关控件的状态

#就是一个边框
timeout_label1111 = Label(text='',relief=GROOVE).place(x=1, y=102, width=479, height=29)
#超时时间
timeout_label = Label(text='超时时间(秒):', anchor='w')
timeout_label.place(x=2, y=104, width=80, height=24)
timeout_label_text = StringVar()
timeout_label_text.set(2)
timeout_label_Entry = Entry(textvariable = timeout_label_text)
timeout_label_Entry.place(x=80, y=104, width=24, height=24)

#重试次数
RetryNum_label = Label(text='重试次数:', anchor='w')
RetryNum_label.place(x=115, y=104, width=60, height=24)
RetryNum_label_text = StringVar()
RetryNum_label_text.set(6)
RetryNum_label_Entry = Entry(textvariable = RetryNum_label_text)
RetryNum_label_Entry.place(x=174, y=104, width=45, height=24)

#替换网址
ChangeDomain_label = Label(text='域名替换:', anchor='w')
ChangeDomain_label.place(x=240, y=104, width=60, height=24)
ChangeDomain_label_text = StringVar()
ChangeDomain_label_text.set('javdb521.com(无用,预留)')
ChangeDomain_label_Entry = Entry(textvariable = ChangeDomain_label_text)
ChangeDomain_label_Entry.place(x=300, y=104, width=178, height=24)

#解析番号
Parse_VideoCode_val = IntVar()
Parse_VideoCode_val.set(1)
Parse_VideoCode_Button = Checkbutton(top, text = "获取番号", anchor='w', variable = Parse_VideoCode_val, onvalue=1, offvalue=0)
Parse_VideoCode_Button.place(x=1, y=132, width=100, height=24)

#解析演员名
Parse_actors_val = IntVar()
Parse_actors_val.set(1)
Parse_actors_Button = Checkbutton(top, text = "获取演员", anchor='w', variable = Parse_actors_val, onvalue=1, offvalue=0)
Parse_actors_Button.place(x=(480/4)*1, y=132, width=100, height=24)

#解析磁力链接
Parse_magnet_val = IntVar()
Parse_magnet_val.set(1)
Parse_magnet_Button = Checkbutton(top, text = "获取磁力", anchor='w', variable = Parse_magnet_val, onvalue=1, offvalue=0)
Parse_magnet_Button.place(x=(480/4)*2, y=132, width=100, height=24)

#Debug开关
Debug_val = IntVar()
Debug_val.set(0)
Debug_Button = Checkbutton(top, text = "Debug", anchor='w', variable = Debug_val, onvalue=1, offvalue=0)
Debug_Button.place(x=410, y=132, width=100, height=24)

#文件过滤展示框
Filter_list_textbox = ScrolledText(relief="solid")
Filter_list_textbox.place(x=1, y=100+59, width=236, height=319)
Init_file_list_text(Filter_list_textbox,filter_list) #刷新过滤框中的文件过滤列表

#文件夹内的文件展示
AllFile_list_textbox = ScrolledText(relief="solid")
AllFile_list_textbox.place(x=241, y=100+59, width=236, height=319)
GetMDFileList(Folder_value.get())                       #获取当前.py文件所在目录下的.md文件列表
Init_file_list_text(AllFile_list_textbox,AllFileList)   #刷新过滤框中当前目录下文件列表

#进度条
progressbar1 = Progressbar(top, orient='horizontal', length=250, mode='determinate')
progressbar1.place(x=1, y=479, width=478, height=20)
progressbar1['maximum'] = 250
progressbar1['value'] = 0

top.mainloop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值