用 Tkinter 实现简单的猜数字游戏

背景

TkDocs tutorial 里介绍了 Tkinter\text{Tkinter} Tkinter,其中有 A First (Real) Example 一文,这篇文章里有一个使用 Tkinter\text{Tkinter} Tkinter 生成图形化界面的简单例子。我想在那篇文章的基础上实战一下,于是想到可以写一个简易的猜数字游戏。

正文

代码

完整的代码如下

python 复制代码
from tkinter import *
from tkinter import ttk
import random

lower_bound = 0
upper_bound = 99
target = random.randint(lower_bound, upper_bound)
game_ended = False
guess_cnt = 0

def disable_buttons(low, high):
    for v in range(low, high + 1):
        button_dict[v].state(['disabled'])

def guess(num):
    global guess_cnt
    global game_ended
    global lower_bound
    global upper_bound
    if game_ended:
        return

    guess_cnt += 1
    cnt_message.set("一共猜了%d次" % guess_cnt)
    if num == target:
        result_message.set("您猜对了,目标值是%d" % target)
        game_ended = True
        return
    
    if num < target:
        result_message.set("您猜的数字(%d)比目标值小" % num)
        disable_buttons(lower_bound, num)
        lower_bound = num + 1
    else:
        result_message.set("您猜的数字(%d)比目标值大" % num)
        disable_buttons(num, upper_bound)
        upper_bound = num - 1

root = Tk()
root.title("猜数字")

mainframe = ttk.Frame(root, padding=(3, 3, 12, 12))
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

messsageframe = ttk.Frame(root, padding=(3, 3, 12, 12))
messsageframe.grid(column=0, row=1, sticky=(N, W, E, S))

def add_button(row, col):
    num = row * n + col
    return ttk.Button(mainframe, text=str(num), command=lambda: guess(num))
   
n = 10
button_dict = {}
for row in range(n):
    for col in range(n):
        num = row * n + col
        button = add_button(row, col)
        button.grid(column=col, row=row, sticky=W)
        button_dict[num] = button

result_message = StringVar()
ttk.Label(messsageframe, textvariable=result_message).grid(column=1, row=10, sticky=W)

cnt_message = StringVar()
ttk.Label(messsageframe, textvariable=cnt_message).grid(column=2, row=10, sticky=E)

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
mainframe.columnconfigure(2, weight=1)
for child in mainframe.winfo_children(): 
    child.grid_configure(padx=5, pady=5)

root.bind("<Return>", guess)

root.mainloop()

运行

请将上一小节展示的完整代码保存为 guess_number.py。使用如下命令可以运行 guess_number.py

bash 复制代码
python3 guess_number.py

运行效果如下 ⬇️ 最初一共有 100100 100 个按钮可以点击

我们可以随意选择一个按钮(在下图演示的例子中,我点击了 5151 51,而且目标值比 5151 51 大)来点击,示例效果如下 ⬇️

现在只剩下 52,53,54,⋯ ,9952,53,54,\cdots,99 52,53,54,⋯,99 这些按钮可以点击了。继续操作几次 ⬇️ (下图只是示例效果,您在尝试时,很可能会看到不同的效果)

我猜了 77 7 次,总算猜对了 ⬇️

参考资料

相关推荐
万少21 小时前
用腻了 WorkBuddy 的默认界面?这个开源小工具给它换上了毛玻璃
前端·javascript·后端
皮皮林5511 天前
代码越“整洁”,性能越“拉胯”?
后端
benchmark_cc1 天前
如何用 Python + QuantDash 快速构建高胜率“配对交易(Pairs Trading)”策略?
开发语言·人工智能·python·pandas·量化交易·quantdash
金金金__1 天前
一篇文章带你入门OpenSpec
后端
阿维的博客日记1 天前
MultipartFile 是不是表示仅仅是一个分片?
java·后端·spring·multipartfile
海上彼尚1 天前
Nodejs也能写Agent - 16.LangGraph篇 - 条件分支与循环
前端·后端·langchain·node.js
Python+991 天前
Java 枚举类(Enum)详解:从基础到高级应用
java·开发语言·python
dunge20261 天前
2026年7月最新ChatGPT Plus / Pro 与 Codex:当 AI Agent 最新5.6版本来袭,必须理解事务、幂等与补偿
开发语言·人工智能·python
Dovis(誓平步青云)1 天前
远程办公软件文件传输实测:6 款工具的速度、稳定性和办公体验对比
linux·运维·服务器·后端·生成对抗网络
凌虚1 天前
AI 时代,程序员会消失吗?
人工智能·后端·程序员