利用爬虫技术获取英语单词,并通过tkinter库实现猜单词游戏

利用爬虫技术获取英语单词,并通过tkinter库实现猜单词游戏

效果图如下:

你需要掌握的知识:
1.tkinter库
2.爬虫技术

总之,简单易懂,源代码如下。

#无网络条件下的单词表

# words=['abstract', 'abstraction', 'accomplish', 'accuracy', 'affiliated', 'algorithm', 'algorithmic', 'alias', 'aliasing', 'allocate', 'alternative', 'ambiguous', 'anticipate', 'apparatus', 'arbitrary', 'archery', 'architecture', 'argument', 'arithmetic', 'ascending', 'assert', 'assignment', 'asymptotic', 'automobile', 'balance', 'binary', 'bind', 'bisection', 'blank', 'block', 'bookmark', 'bound', 'bundle', 'calculator', 'canopy', 'capitalize', 'capture', 'cardiovascular', 'cascade', 'category', 'checker', 'circumference', 'clause', 'clue', 'cluster', 'code', 'coherent', 'collection', 'comma', 'command', 'comparison', 'compiler', 'complexity', 'compound', 'computable', 'computation', 'computational', 'compute', 'concatenate', 'concatenation', 'conceptualize', 'conditional', 'configuration', 'conform', 'conquer', 'console', 'construct', 'convert', 'correspond', 'corresponding', 'covert', 'crash', 'crucial', 'cube', 'cumbersome', 'current', 'dealt', 'debug', 'decimal', 'declarative', 'decode', 'deduce', 'default', 'defensive', 'demo', 'denote', 'deposit', 'derivative', 'deviation', 'diagram', 'dictionary', 'difference', 'disc', 'discretion', 'disregard', 'distinct', 'distribution', 'division', 'divisor', 'doctorate', 'documentation', 'driver', 'dub', 'duplicate', 'ease', 'editor', 'encapsulate', 'encapsulation', 'endpoint', 'engage', 'enigma', 'enroll', 'entry', 'enumeration', 'environment', 'epsilon', 'equivalent', 'essentially', 'evaluate', 'exception', 'execute', 'exhaustive', 'exponentiation', 'exterminate', 'factorial', 'fetal', 'fix', 'flag', 'flexibility', 'float', 'formalism', 'fraction', 'frame', 'generalization', 'generate', 'gestation', 'gigabyte', 'guarantee', 'GUI', 'halt', 'handle', 'handler', 'hence', 'heuristic', 'hierarchy', 'hint', 'hypothesis', 'identifier', 'illustrate', 'immutable', 'imperative', 'implement', 'implementation', 'implication', 'import', 'inclusive', 'incorporate', 'increment', 'indentation', 'index', 'indicate', 'indication', 'indirection', 'induction']

##猜单词游戏,利用网络爬虫实现单词库的获取,请在有网络的情况下使用

import random
import time
from urllib import request
from lxml import  etree
import tkinter as tk
from tkinter import*
from tkinter import ttk

#利用tkinter库实现
#词汇表
words=[]
class Guess_word:
    def __init__(self):
        self.get_words() 
        self.win_times=0
        self.lose_times=0
        self.final_time=' '
        self.gui()  
    def get_words(self):
        def Get_Shanbay(page):
            url="https://www.shanbay.com/wordlist/104899/202159/?page=%s"%page
            rsp=request.urlopen(url)
            html=rsp.read()
            html=etree.HTML(html)
            tr_list=html.xpath("//tr")
            for tr in tr_list:      
                strong = tr.xpath('.//strong')
                if len(strong):
                    name=strong[0].text.strip()
                    words.append(name)
        for i in range(1,10):
            Get_Shanbay(i)
            print('爬取单词中……')
    def shuffle_word(self,word):
        list_word=list(word)
        random.shuffle(list_word)
        return ''.join(list_word)
    def gui(self):
        self.start()
        self.main_gui()
    def main_gui(self):
        self.root=Tk()
        self.root.title('hangman')
        self.root.geometry('+0+0')
        self.root.geometry('1000x800') 
        Label(self.root,text="Welcome to the word guessing game!", bg='green',font=('Arial', 12), fg="white",width=50, height=2).pack() 
        number=tk.StringVar()
        self.Listchoose=ttk.Combobox(self.root,width=12,textvariable=number,state='readonly')
        self.Listchoose['values']=['娱乐模式','时间模式']    
        self.Listchoose.bind("<>",self.mode)
        self.Listchoose.pack()    
        self.Listchoose.set('请选择游戏模式') 
        self.root.mainloop()
    def mode(self,event):
        self.root2=Tk()
        self.root2.title('hangman')
        self.root2.geometry('+0+0')
        self.root2.geometry('1000x800')
        self.label=Label(self.root2,text="Welcome to the word guessing game!", bg='green',font=('Arial', 12), fg="white",width=50, height=2)
        self.label.pack()
        self.button2=tk.Button(self.root2,text="退出",bd=4,bg="yellow",activebackground="orange",command=self.Quit,padx=100)
        self.button2.pack(side=tk.LEFT)
        mode_name=self.Listchoose.get()    
        if(mode_name=='娱乐模式'):
            self.mode1()
        else:
            self.mode2()
        self.root2.mainloop()
    def mode1(self):
        self.display()
        def judge(event):
            if self.entry.get()==self.correct_word:
                self.win_times+=1
                self.label.configure(text="Congratulations! You're right! ",bg='red')
            else:
                self.lose_times+=1
                self.label.configure(text="Sorry! You're wrong! And the correct word is "+self.correct_word+".",bg='blue')
        self.entry.bind("",judge) 
        self.button1=tk.Button(self.root2,text="下一题",bd=4,bg="orange",activebackground="yellow",command=self.next1,padx=100)
        self.button1.pack(side=tk.RIGHT)
    def mode2(self):
        messagebox.showinfo("提醒","请在十秒之前内写出你的答案!")
        self.get_final_time()
        self.get_time()
        self.display()
        def judge(event):
            self.final_time=' '
            if self.entry.get()==self.correct_word:
                self.win_times+=1
                messagebox.showinfo("correct!","Congratulations! You're right!")
                self.time_over('0003.gif','耶!')
                self.label.configure(text="Congratulations! You're right! ",bg='red')
            else:
                self.lose_times+=1
                messagebox.showinfo("Wrong answer","Sorry! You're wrong! And the correct word is "+self.correct_word+".")
                self.time_over('0004.gif','呜呜~')
                self.label.configure(text="Sorry! You're wrong! And the correct word is "+self.correct_word+".",bg='blue')
        self.entry.bind("",judge) 
        self.button2=tk.Button(self.root2,text="下一题",bd=4,bg="orange",activebackground="yellow",command=self.next2,padx=100)
        self.button2.pack(side=tk.RIGHT)
    def display(self):
        self.correct_word,shuffle_word=self.get_correct_shuffle_word()
        self.label1=Label(self.root2, text='Disordered word:  '+shuffle_word,font=('楷体', 14))
        self.label1.place(x=10, y=80)
        Label(self.root2, text='Guess the word:', font=('楷体', 14)).place(x=10, y=120)
        num=tk.StringVar()
        self.entry=tk.Entry(self.root2,textvariable=num,font=('Arial', 10))
        self.entry.place(x=180,y=125)
    def get_final_time(self):
        long=10   #答题时长
        hms=time.strftime('%H %M %S').split()
        allsecond=int(hms[0])*3600+int(hms[1])*60+int(hms[2])+long
        strtime=allsecond//3600
        h=str(allsecond//3600)
        m=str(allsecond%3600//60)
        s=str(allsecond%3600%60)
        if len(h)==1:
            h='0'+h
        if len(m)==1:
            m='0'+m
        if len(s)==1:
            s='0'+s
        self.final_time=h+':'+m+':'+s
    def time_over(self,img,text):
        self.root3=Toplevel()
        self.root3.title('Welcome to hangman!')
        self.root3.geometry('+0+0')
        self.root3.geometry('800x600')
        self.picture(self.root3,2,img)
        button=Button(self.root3,text=text,bd=4,bg="orange",activebackground="yellow",command=self.Exit,padx=50)
        button.pack()
    def Exit(self):
        self.root3.destroy()
    def get_time(self):
        Time=time.strftime('%Y-%m-%d %H:%M:%S')
        Label(self.root2, text='当前时间:', bg='gold', font=28).place(x=380, y=50)
        clock=Label(self.root2,text=Time,font=28)
        clock.place(x=465, y=50)
        if Time[11:]==self.final_time:         
            messagebox.showinfo("超时",'时间到了!正确答案是: '+self.correct_word)
            self.time_over('0002.gif','别骂了别骂了')
        clock.after(1000,self.get_time)
    def Quit(self):
        messagebox.showinfo('战绩',f'您在这次游戏中共答对{self.win_times}道题,答错{self.lose_times}道题')
        self.win_times=0
        self.lose_times=0
        self.root2.destroy()   
    def next1(self):
        self.entry.delete(0,'end')
        self.button1.destroy()
        self.label1.destroy()
        self.label.configure(text="Welcome to the word guessing game!", bg='green')
        self.mode1()
    def next2(self):
        self.entry.delete(0,'end')
        self.button2.destroy()
        self.label1.destroy()
        self.label.configure(text="Welcome to the word guessing game!", bg='green')
        self.mode2()
        
    def get_correct_shuffle_word(self):
        correct_word=random.choice(words)
        return correct_word,self.shuffle_word(correct_word)
    def start(self):
        self.root1=Tk()
        self.root1.title('Welcome to hangman!')
        self.root1.geometry('+0+0')
        self.root1.geometry('800x600')
        Label(self.root1,text='我  爱  记 单 词 ', fg='red', bg='yellow',font=('宋体', 30)).pack(side='top')
        self.picture(self.root1,12,'0001.gif')
        button1=Button(self.root1,text="进入猜单词游戏",bd=4,bg="orange",activebackground="yellow",command=self.Start,padx=50)
        button1.pack()
        self.root1.mainloop()
    def picture(self,pos,numIdx,img):
        frames=[PhotoImage(file=img,format='gif -index %i' %(i)) for i in range(numIdx)]
        def update(idx):
            frame = frames[idx]
            idx+=1
            label.configure(image=frame)
            pos.after(100, update, idx%numIdx)
        self.labelframe=LabelFrame(pos,text='图片展示',height=500,width=600)
        self.labelframe.pack(padx=10,pady=10)
        self.labelframe.pack_propagate(0)
        label=Label(self.labelframe)
        label.pack()
        pos.after(0,update, 0)
        
    def Start(self):
        messagebox.showinfo("提示","你正在进入猜单词游戏!\n你准备好了吗?")
        self.root1.destroy()
if __name__=='__main__':
    guess_word=Guess_word()
        

最后

代码中还有很多不尽人意的地方,由于作者技术水平的限制,暂时没有实现各种已有的设计理念,比如,利用多线程设计一个PK模式,图形界面的软件应用优化等等,感兴趣的哥哥姐姐们不妨试试。我在评论区静候你们的佳音。

你可能感兴趣的:(python,tkinter,python,爬虫)