专栏首页小詹同学教你用 Python 玩 GUI 猜数字游戏 。

教你用 Python 玩 GUI 猜数字游戏 。

假设同学聚会玩个猜数字的小游戏 :在[100, 999] 区间内随机生成一个数字 ,之后在其中猜 ,每次猜数会给出指示 ,提示大了还是小了 。那么你要几次能够猜中呢 ?好吧 ,今天重点不是小詹教你二分查找 。而是读者来稿如下 :

小 A 最近考完试 ,甚是无聊啊 ,翻开书本学习了一下 GUI ,你肯定很是好奇啊,GUI是啥啊?一看英文G(鸡鸡,哦,当然不是啦,就是叼的意思啦) ,UI(就是界面的意思) 。合起来,叼界面,足够你去发挥你的想象力了,闭上眼睛,那个画面铺面而来啊,哈哈。

在 python 常用的库里有一个标准的 GUI 库 ,就是 Tkinter 。这是一个TkGUI工具包接口 。专门用于快速实现用于图形界面的一个标准模块 。

就像我们开车一样 ,首先要打开门 ,程序也一样要用到的库都需要提前安装

pip install Tkinter

同志们 ,接下来开车了 ,我们应该如何去创建一个 GUI 程序呢 ?不用急 ,代码步骤如下 :

# 导入使用的GUI模块 Tkinter # 创建GUI的主要应用程序入口 # 添加控件并设置相应的属性 # 编写触发事件响应代码

接下来 Ken 就来带你撸一把 :导入使用的GUI模块 Tkinter ;创建GUI的主要应用程序入口 。简单粗暴的展示了一下最简单的界面 。

from tkinter import * root = Tk() root.mainloop()

意不意外,惊不惊喜,这么短短的三句代码,就能出现一个界面,是不是很刺激。

接下来就是 设置相应的属性

from tkinter import * root = Tk() root['background'] = 'yellow' root['height'] = 330 root['width'] = 450 root['cursor'] = 'coffee_mug' root.title('我的第一个窗口程序') root.resizable(False,False) root.mainloop()

程序运行之后 ,就会出现一坨黄黄的 ( 像极了粑粑 ) ,你懂的 。。

添加控件

我们为窗口添加一个控件 ,用于设置提示文本 。

from tkinter import * root = Tk(className="登陆") label1 = Label(root) label1['text'] = "Hello World" label2 = Label(root) label2['text'] = "小詹学Python" label1.pack() # label1显示出来 label2.pack() # label2显示出来 root.mainloop()

程序运行之后就会出现 "Hello World 小詹学Python"

编写触发事件响应代码

就像我们页面一样 ,要有点击功能 ,肯定要给页面按钮绑定点击事件 。我们也可以为键盘绑定事件 ,后面猜数字游戏会讲到 。

from tkinter import * root = Tk(className="事件处理实例") # 初始化窗口信息 def click(event): # 定义点击事件 print("鼠标当前位置是[{0},{1}]".format(event.x,event.y)) def keyPress(event): # 定义按键事件 print("按下了{0}键".format(repr(event.char))) frame = Frame(root,width=200,height=120) # 创建一个框架 frame.bind("",click) # 绑定左键点击事件 entry = Entry(root) # 添加文本框 entry.bind("",keyPress) # 文本框添加键盘处理事件 entry.pack() # 显示文本框 frame.pack() # 显示框架 root,mainloop()

是不是很有趣啊 ,看看下图 :

接下来分分钟带你搞定一个 GUI 数字游戏 ,首先我们当然是需要一个随机数的生成 ,也需要引入这个标准库 ,定义需要引用到的全局变量 ,以便后面的函数去使用 。

from tkinter import * import random number = random.randint(100,999) num = 0 maxnum = 999 minnum = 100 running = True

接下来我们需要关闭窗口的事件 (destory) 。就像我们页面一样 ,按钮点击就可以把某个不需要显示的控件给关闭掉 。

def btnCloseClick(event): root.destory()

是不是很简单呢 ,就两行代码 ,就可以关闭窗口了 ,我们拭目以待吧 。除了关闭按钮之外 ,我们当然还需要一个重置窗口 。就像我们表单登录一样 ,重置密码 。

def btnResetClick(event): global number # 引用外部变量 global running # 引用外部变量 global num # 引用外部变量 global maxnum # 引用外部变量 global minnum # 引用外部变量 number = random.randint(100,999) # 重新赋值 running = True # 重新赋值 num = 0 # 重新赋值 labelChange("请输入100到999之间任意整数:") entry_num.delete(0,'end') labelRange('目前的范围是[%d,%d]'%(minnum,maxnum)) print(number)

我们要猜数字 ,当然需要一个文本框用来输入数字 ,然后确定 ,给出提示 。

def btnGuessClick(event): global num global running global maxnum global minnum if running: answer = int(entry_num.get()) if answer == number: labelChange("恭喜答对了!") num+=1 running = False numGuess() elif answer < number: num+=1 labelChange("小了哦") if answer>minnum: minnum=answer else: num+=1 labelChange("大了哦") if answer<maxnum: maxnum=answer labelRange('目前的范围是[%d,%d]'%(minnum,maxnum)) else: labelChange('你已经答对啦.')

最终我们才对了游戏的结果,我们还要给出信息提示:

def numGuess(): if num == 1: labelChange('好棒!一次答对!') elif num < 9: labelChange('好厉害,尝试次数:'+str(num)) elif num < 19: labelChange('还行,尝试次数:'+str(num)) else: labelChange('您都试了超过20次了。。。。尝试次数:'+str(num)) def labelChange(vText): # 定义控件信息修改函数 label_info.config(label_info,text=vText) def labelRange(cText): label_range.config(label_range,text=cText)

最终所有代码整合起来的结果,由程序运行如下

总结

  • 妈妈终于不用担心我玩游戏了
  • 导入使用的GUI模块 Tkinter
  • 创建GUI的主要应用程序入口
  • 添加控件并设置相应的属性
  • 编写触发事件响应代码
  • 如果感兴趣 ,可以试试手写二分查找法噢

本文分享自微信公众号 - 小詹学Python(xiaoxiaozhantongxue)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 叮!你要的Python脱单攻略已送达

    年关将至,学妹却因为男朋友不愿意带她回家过年而难过,我劝学妹主动点,自己多提几次,但是学妹觉得身为女孩子不能太主动。

    小小詹同学
  • Leetcode打卡 | No.012 整数转罗马数字

    欢迎和小詹一起定期刷leetcode,每周一和周五更新一题,每一题都吃透,欢迎一题多解,寻找最优解!这个记录帖哪怕只有一个读者,小詹也会坚持刷下去的!

    小小詹同学
  • 浙大提出会打德扑的「自我博弈」AI,还会玩射击游戏

    随着深度强化学习的快速发展,AI 已经在围棋等信息完整的游戏中战胜了人类专业玩家。然而,「星际争霸」等信息不完整游戏的研究还没有取得同样的进展。这类研究的一大问...

    小小詹同学
  • 百万条数据快速查询优化技巧参考

    所以的优化并不是绝对,具体得根据业务实际情况 百万条数据快速查询优化技巧 1.应尽量避免在where子句中使用!=或<>操作符 2.应尽量避免在where子句中...

    逸鹏
  • 第一次vulnhub靶机的渗透

    最近一直在学习渗透测试相关的理论知识,看书看的头大,趁着老婆孩子回娘家的这段时间终于可以在晚上搞搞实验过过手瘾啦

    光明SAMA
  • 模拟投骰子并可视化

    用户3577892
  • nginx反向代理问题处理记录

    老七Linux
  • 快速学习-Scala整数类型

    cwl_java
  • Hack the box-Traverxec

    大家好,今天给大家带来的CTF挑战靶机是来自hackthebox的“Traverxec”,hackthebox是一个非常不错的在线实验平台,能帮助你提升渗透...

    Aran
  • 剑指offer——年龄排序问题

    题目:对某公司所有员工的年龄进行排序,要求时间复杂度为O(n) 分析:         在已有的排序算法中,性能最好的是快速排序,但是他在最好的情况下时间复杂度...

    大闲人柴毛毛

扫码关注云+社区

领取腾讯云代金券