黑马程序员技术交流社区

标题: python 基于Tkinter的姻缘测试器 [打印本页]

作者: 易大帅    时间: 2017-3-22 07:38
标题: python 基于Tkinter的姻缘测试器
python 基于Tkinter的姻缘测试器xihuanqiqi)                       
                                                        前期吐槽:
还记得8年前,大概是八年级的时候,那时候自己很帅。。
《名字打架》这款小游戏还是挺火的。。
突然想起来,就用Tkinter做了个。。类似的。。很挫,不过编程,就是自由,想怎么编就怎么编。。
改了个名字,叫姻缘测试器。。
其实真的很无聊,就是巩固下Tkinter。。没什么意思。。大神可以别看。。


算法
MD5 + 是否能够mod 3 尽,两个人都能mod尽,那就最屌了,只有一个人mod 3尽,就凑合,如果都mod 不尽,就可能不适合。
为什么是3呢? 你不觉得世界很多东西和3有关系吗?很多时间间隔是3秒,多了就长,少了就短。而且,本人和3关系很大。。家里排老三呢。。




大概长个样子







代码
# -*- coding: utf-8 -*-from Tkinter import *from ttk import Frame, Button, Style, Entry, Labelimport tkMessageBox import reimport urllib, Queue, sgmllibimport timeimport threadingimport tkFileDialogimport randomimport hashlibclass NameFighter(Frame):    txt = ""    area = None    en1 = None    en2 = None        def __init__(self,parent):        Frame.__init__(self,parent)        self.parent = parent        self.initUI()                #事件绑定,用来实时显示text        self.parent.bind("<<A>>", lambda evt:self.area.insert(END,self.txt))        #事件绑定,让Text跟踪到最新一行        self.parent.bind("<<CurrentView>>", lambda evt:self.area.see(END))        #事件绑定,让goBtn恢复正常        self.parent.bind("<<NormalGoBtn>>", lambda evt: self.goBtn.config(state = NORMAL))    def do_figting(self,moves,n1,n2,b1,b2):        try:            self.txt = "如果两人能够坚持越久轮,爱情就越稳固!\n"            self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本            self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本            time.sleep(1)                        for i in range(5,0,-1):                self.txt = "倒计时:"+str(i)+"秒!\n"                self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本                self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本                time.sleep(1)                            self.txt = n1 + " 初始血量:"+ str(b1)+" \n" + n2 + " 初始血量:"+str(b2)+" \n"            self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本            time.sleep(1)                        flag = 1                        while b1 > 0 and b2 > 0:                self.txt = "\n=========================第"+str(flag)+"轮=========================\n"                self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本                self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本                time.sleep(1)                                tempb = random.randint(300,400)                tempm = random.randint(0,len(moves)-1)                if flag % 2 == 0:                    b2 -= tempb                    if b2 < 0 :                        self.txt = n2+" 不堪重负,被 "+n1+"活活打死了...\n"                    else:                        self.txt = n1+" "+moves[tempm]+" "+n2+" 造成"+str(tempb)+"的伤害!"                        self.txt += n2+"剩下血量:"+str(b2)+"\n"                else:                    b1 -= tempb                    if b1 < 0 :                        self.txt = n1+" 不堪重负,被 "+n2+"活活打死了...\n"                    else:                        self.txt = n2+" "+moves[tempm]+" "+n1+" 造成"+str(tempb)+"的伤害!"                        self.txt += n1+"剩下血量:"+str(b1)+"\n"                flag += 1                self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本                self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本                time.sleep(1.5)            self.txt = "\n======================一切都结束了======================\n"            self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本            self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本            time.sleep(1)                        #真正的逻辑,以3为基准            if b1 % 3 == 0 and b2 % 3 == 0:                self.txt = "恭喜"+n1+" 和 "+n2+"!你们非常适合在一起!\n"            elif b1 % 3 == 0 or b2 % 3 == 0:                self.txt = "恭喜"+n1+" 和 "+n2+"!因为有一个人比较迁就的关系,你们还算比较适合在一起!\n"            else:                self.txt = "哎!"+n1+" 和 "+n2+"!貌似不合适?不想说什么!\n"            self.parent.event_generate("<<A>>",when="tail")#触发bind的事件,也就是显示文本            self.parent.event_generate("<<CurrentView>>",when="tail")#触发bind的事件,也就是显示文本                        finally:            self.parent.event_generate("<<NormalGoBtn>>",when="tail")#触发bind的事件,让goBtn恢复                def onGo(self):        maleName = self.en1.get()        famaleName = self.en2.get()        n1 = maleName.encode("utf8")        n2 = famaleName.encode("utf8")                md5_1 = hashlib.md5()        md5_1.update(n1)        md5_1 = md5_1.hexdigest().upper()        md5_2 = hashlib.md5()        md5_2.update(str(n2))        md5_2 = md5_2.hexdigest().upper()        blood_1 = 0         for i in range(len(md5_1)):            blood_1 += ord(md5_1)        print blood_1        blood_2 = 0         for i in range(len(md5_2)):            blood_2 += ord(md5_2)        print blood_2                        if maleName == "" or famaleName == "":            tkMessageBox.showinfo('逗比','你不写名字我怎么算\n' )        else:            moves = ['咬了一口','踢了一下','挠了一下','放出了大海无量打中','舔了一下','搓了一下','吼了一下']            self.goBtn.config(state=DISABLED) #先置为disabled                        do_figting_thread = threading.Thread(target=self.do_figting,args = (moves,n1,n2,blood_1,blood_2,))            do_figting_thread.start()                                    def onHelp(self):        tkMessageBox.showinfo('玩法','随便点点,即使是逗比也会玩呢\n' )           def initUI(self):        #大小,位置        w = 600        h = 400        sw = self.parent.winfo_screenwidth()        sh = self.parent.winfo_screenheight()        x = (sw-w)/2        y = (sh-h)/2        self.parent.geometry('%dx%d+%d+%d' % (w,h,x,y))        self.parent.title("哈尔滨马家沟男子职业技术学院出品!电脑算命-姻缘测试器")            #风格        self.style = Style()        self.style.theme_use("default")                Style().configure("TButton", padding = (0, 5, 0, 5), font='serif 10')        #控件位置调控        self.columnconfigure(1, weight = 1)        self.columnconfigure(2, pad = 7)        self.rowconfigure(3, weight = 1)        self.rowconfigure(5, pad = 7)        #标签        lb1 = Label(self, text = "请输入男方姓名: ")        lb1.grid(row = 0, column = 0, sticky = W)        lb2 = Label(self, text = "请输入女方姓名: ")        lb2.grid(row = 1, column = 0, sticky = W)        #输入点Entry        self.en1 = Entry(self)        self.en1.grid(row = 0, column = 1,  columnspan = 1, sticky = W+E)        self.en2 = Entry(self)        self.en2.grid(row = 1, column = 1,  columnspan = 1, sticky = W+E)        #显示结果的text & Scrollbar        self.area = Text(self, bg = 'black', fg = 'green')        self.area.grid(row = 2,column = 0, columnspan = 2, rowspan = 4, sticky = E+W+S+N)        self.area.see(1000.0)                self.sb = Scrollbar(self)        self.sb.grid(row = 2, column = 1, rowspan = 4, sticky = E+W+S+N)        self.area['yscrollcommand'] = self.sb.set #text往下走,触发scrollbar的set()        self.sb['command'] = self.area.yview #scrollbar的拖动,触发text的view移动        #Go按钮        self.goBtn = Button(self, text = "Go!",command = self.onGo)        self.goBtn.grid(row = 0, column = 2)                lb3 = Label(self, text = "电脑算命-绝对准确, made by ouyang! ")        lb3.grid(row = 6, column = 1, sticky = E)        #Help按钮        helpBtn = Button(self, text = "怎么玩?",command = self.onHelp)        helpBtn.grid(row = 6, column = 2)        #最终绑定        self.pack(fill = BOTH,expand = 1)        def main():    root = Tk()    root.geometry("250x150+300+300")    app = NameFighter(root)    root.mainloop()if __name__ == '__main__':    main()

重点关注
事件的绑定和触发
事件触发的时候,把事件放到tail最好,不然容易乱。。。when="tail"


作者: yuhongqiang    时间: 2017-3-22 08:07
66666666

作者: starhub    时间: 2017-3-22 10:33
你这资源都是在哪看的

作者: 我就是看看    时间: 2017-3-22 15:33
我想去摆个摊了
作者: 我就是看看    时间: 2017-3-22 15:34
为什么本版全是你的贴子啊
作者: 易大帅    时间: 2017-3-22 23:47
我就是看看 发表于 2017-3-22 15:34
为什么本版全是你的贴子啊

帅吧,除了这我无法解释!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2