zoukankan      html  css  js  c++  java
  • 自动化AC器(带界面版)

    第一次写这种东西,写起来尤其的生疏。要不是py的课设有点赶不及,也不会来做这个···
    总体而言并不难,但之前一直在写算法题,导致对应用这方面的东西几乎是位0的了解。
    界面用的是tkinter,自己写的也是丑的出奇。界面逻辑也很混乱,但总归是写出来了
    (我估计我一周后绝对看不懂我写的是什么了····
    代码不长,逻辑也很简单,将就着看吧

    from tkinter import *
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import HTMLParser,requests,re,time,os,sys
    html_parser = HTMLParser.HTMLParser()
    host_url = 'http://acm.hdu.edu.cn'
    head = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36' }
    s = requests.session()
    
    def Get_code(url):
        try:
            html =urlopen(url)
        except ValueError as e:
            # print("ValueError")
            return None
        bsobj = BeautifulSoup(html,"html.parser")
        codelist = bsobj.findAll("pre",{"class":"cpp"})
        if len(codelist)>0:
            text = codelist[0].get_text()
            rul = re.compile('freopen.*?);')
            text = rul.sub('',text)
            #print(text)
            #text.replace(rul,'')
            return text
    
    # 从CDSN爬取代码
    def Csdn_Search(number):
        csdn_url = 'https://so.csdn.net/so/search/s.do?q='
        url = csdn_url+'HDU'+number
        html = urlopen(url)
        bsobj = BeautifulSoup(html,"html.parser")
        bsobj=bsobj.findAll('dl',class_="search-list J_search")
        linklist = list()
        for i in bsobj:
            x = i.find('a').get('href')
            linklist.append(x)
        code =list()
        for link in linklist:
            #print(link)
            res = Get_code(link)
            if res != None:
                code.append(res)
        return code
    
    # 判断提交代码是否成功AC
    def Is_AC(user,number):
        check_url = 'http://acm.hdu.edu.cn/status.php?first=&pid='+number+'&user='+user
        #print(check_url)
        html = urlopen(check_url)
        bsobj = BeautifulSoup(html,"html.parser")
        bsobj = bsobj.findAll('font',{'color':'red'})
        if len(bsobj) == 0:
            return 'WA'
        else:
            return 'AC'
    # 判断提交代码时的语言
    def select_language(code):
        if 'import java' in code:
            return '5'
        else:
            return '0'
    
    # 向HDU提交评测代码
    def submit(codelist,user,number):
        path = sys.path[0]
        filename = path+'HDU'+number
        s.get(host_url,headers=head)
        sub_url = 'http://acm.hdu.edu.cn/submit.php?action=submit'
        for code in codelist:# 遍历所有爬到的代码
            language=select_language(code)
            datas = {'check':'0','problemid':number,'language':language,'usercode':code}
            r = s.post(sub_url,headers=head,data=datas)
            time.sleep(10)# 等待评测机判题
            res = Is_AC(user,number)
            print('submit successful')
            if res == 'AC':
                if language == '5':
                    filename = filename +'.java'
                else:
                    filename = filename +'.cpp'
                print(filename)
                fp = open(filename,'w')
                fp.write(code)
                return True
        return False
    
    # 提交的子窗口
    def sub(usr_name):
        AC.title('Submit')
        AC.geometry('350x300')
        # 背景画布
        can = Canvas(AC,height=450,width=400)
        Submit_File=PhotoImage(file=sys.path[0]+'login.png') 
        can.create_image(0,0,anchor='nw',image=Submit_File)
        can.pack(side=TOP)
        id =StringVar()
        Label(AC,text="Problem id: ").place(x=30,y=93)
        global problem
        # 题号输入框
        problem = Entry(AC,textvariable = id,width=15)
        problem.place(x=130,y=95)
        
        # 信息更新窗口
        info = Text(AC,width=40,height=8)
        info.config(state=DISABLED)
        info.place(x=30,y=140)
        def get_id():
            p_id = problem.get()
            succ =True
            try:
                x=int(p_id)
            except ValueError as e:
                info.config(state=NORMAL)
                info.insert(END,'invail id
    ')
                info.config(state=DISABLED)# 让text不能被编辑
                succ=False
            if succ:
                if x >= 6297 or x < 1000:# ID的合法性
                    info.config(state=NORMAL)
                    info.insert(END,'wrong id
    ')
                    info.config(state=DISABLED)
                else:
                    info.config(state=NORMAL)
                    info.insert(END,'Loading......
    ')
                    code=Csdn_Search(p_id)
                    n = len(code) 
                    if n==0:
                        info.insert(END,"'Sorry , Can't find the code
    ")
                    else:
                        info.insert(END,"Find %d codes
    "%n)
                        if submit(code,usr_name,p_id):
                            info.insert(END,"%s Successful AC!
    " %p_id)
                        else:
                            info.insert(END,"Sorry,All codes can't AC
    ")
        
                    info.config(state=DISABLED)
        s = Button(AC,text='submit!',command=get_id)
        s.place(x=270,y=90)
        AC.mainloop()#弹出新的窗口
    def login(user,psw):
        
        post_url = 'http://acm.hdu.edu.cn/userloginex.php?action=login'
        test_url = 'http://acm.hdu.edu.cn/submit.php?pid=1000'
        s.get(host_url,headers=head)
        data = {'username':user,'userpass':psw,'login':'Sign In'}
        s.post(post_url,data=data,headers=head)
        res = s.post(test_url)
        res = res.content.decode('utf-8')
        if 'Source Code' in res: # 判断是否登录成功
            return True
        else:
            return False
    
    def user_T_login():# 新窗口
        user = usr_name.get()
        psw = usr_psw.get()
        if login(user,psw):
            T_login.destroy()
            global AC
            AC=Tk()
            
            sub(user)
            
        else:
            sta.set('Wrong Password')
    
    T_login = Tk()
    T_login.title('LOGIN IN')
    T_login.geometry('350x300')
    # 背景图片
    can = Canvas(T_login,height=450,width=400)
    Image_File =PhotoImage(file=sys.path[0]+'login.png')
    can.create_image(0,0,anchor='nw',image=Image_File)
    can.pack(side=TOP)
    
    Label(T_login,text="User name: ").place(x=30,y=150)
    Label(T_login,text="Password: ").place(x=40,y=190)
    usr_name = StringVar()
    usr_psw = StringVar()
    en_n = Entry(T_login,textvariable=usr_name)# 名字输入框
    en_n.place(x=140,y=150)
    en_p= Entry(T_login,textvariable=usr_psw,show='*')# 密码输入框
    en_p.place(x=140,y=190)
    
    btn = Button(T_login,text="login",command=user_T_login)# 登录按钮
    btn.place(x=150,y=250)
    
    sta = StringVar()
    Label(T_login,textvariable=sta,width=50,height=1).place(x=40,y=220)# 信息提示框
    T_login.mainloop()
    
    

    用到的图片在这里,需要自取

  • 相关阅读:
    情感成本
    已知二叉树前序和中序,求后序
    贫穷的本质
    Centos安装docker及常见docker容器创建脚本
    SpringBoot与SpringCloud对应版本及官方查询方法
    工作流
    Host 'xxx' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
    list_layout.ini说明
    layout.ini说明
    config.ini说明
  • 原文地址:https://www.cnblogs.com/SCaryon/p/9188437.html
Copyright © 2011-2022 走看看