python入门小项目--石头剪刀布(人机对战)--图形化tkinter

继上文用python写了一个小demo,用控制台显示逻辑显然不是很合理,查询了很多资料,发现gui编程有tkinter比较好用,然后就在上一个版本的基础上写了一个进阶

Tkinter是几个常用 Python GUI 库之一


现在就让我们开始把

  • 首先我们要导入 tkinter
    from tkinter import *
  • 然后我们看看怎么使用
	root = Tk()
	root.mainloop()

python入门小项目--石头剪刀布(人机对战)--图形化tkinter_第1张图片

  • 开始第一步先弄个窗口
	# 创建窗口
    root = Tk()
    # 窗口大小 960x300
    root.geometry('960x300')
    # 窗口标题
    root.title('石头剪刀布进阶')
  • 然后先来个标题把,采用的grid栅格布局,比较灵活
 	# 标题好看成功一半(●'◡'●)
    # 标签控件 先写整体的栅格3*4 采用grid布局
    col_1 = Label(root, text='%13s' % '猜', font=('华文彩云', 40), fg='purple')
    # 标签定位 row,column不传默认为0
    col_1.grid(row=0, column=0)
    col_2 = Label(root, text='%13s' % '拳', font=('华文彩云', 40), fg='purple').grid(row=0, column=1)  # 链式调用
    col_3 = Label(root, text='%13s' % '风', font=('华文彩云', 40), fg='purple').grid(row=0, column=2)
    col_4 = Label(root, text='%13s' % '云', font=('华文彩云', 40), fg='purple').grid(row=0, column=3)

python入门小项目--石头剪刀布(人机对战)--图形化tkinter_第2张图片

  • next准备用三个按钮来表示我们的出拳
	# 主体应该是三个按钮
    # 提示
    tip = Label(root, text='%15s' % '请选择', font=('行楷', 20), fg='red').grid()
    # 按钮控件
    button_1 = Button(root, text='石头', font=('行楷', 20), command=button_click_1, activebackground='pink',
                      fg='blue').grid(row=1, column=1)
    button_2 = Button(root, text='剪刀', font=('行楷', 20), command=button_click_2, activebackground='pink', fg='blue')
    button_2.grid(row=1, column=2)
    button_3 = Button(root, text=' 布 ', font=('行楷', 20), command=button_click_3, activebackground='pink', fg='blue')
    button_3.grid(row=1, column=3)

python入门小项目--石头剪刀布(人机对战)--图形化tkinter_第3张图片

  • 一开始就在想点击按钮怎么触发函数,然后发现了command可以触发点击事件
button_1 = Button(root, text='石头', font=('行楷', 20), command=button_click_1, activebackground='pink',
                      fg='blue').grid(row=1, column=1)
def button_click_1():
	#和电脑猜拳比大小
    pass
  • 结果提示,本来想直接修改text的值,发现怎么都不行,后面找到StringVar和textvariable可以实现动态渲染
  	# 结果提示
    # 结果值 定义全局
    global result
    result = StringVar(root)
    result_tip = Label(root, textvariable=result, font=('华文彩云', 20), fg='orange').grid(row=2, column=1, columnspan=2)
  • 效果图
    python入门小项目--石头剪刀布(人机对战)--图形化tkinter_第4张图片

  • 是不是有点看懵逼了,那就上完整代码啦哈哈

# -*- coding: utf-8 -*-
# @Time : 2021/02/19 11:30
# @Author : stt
# @Software: PyCharm
""" functions
Gui_demo provides Graphical User Interface for user to make more fun
"""

from tkinter import *  # *只导入初始化的一些并非全部
from tkinter import messagebox  # 消息提示框
import ctypes
import random

# 定义全局变量
global result
global name
name = 'tt'

def create_tk():
    """ 窗体的主体 """
    # 创建窗口
    root = Tk()
    # 窗口大小 960x300
    root.geometry('960x300')
    # 窗口标题
    root.title('石头剪刀布进阶')

    """ 标题 """
    # 标题好看成功一半(●'◡'●)
    # 标签控件 先写整体的栅格5*5 采用grid布局
    col_1 = Label(root, text='%13s' % '猜', font=('华文彩云', 40), fg='purple')
    # 标签定位 row,column不传默认为0
    col_1.grid(row=0, column=0)
    col_2 = Label(root, text='%13s' % '拳', font=('华文彩云', 40), fg='purple').grid(row=0, column=1)  # 链式调用
    col_3 = Label(root, text='%13s' % '风', font=('华文彩云', 40), fg='purple').grid(row=0, column=2)
    col_4 = Label(root, text='%13s' % '云', font=('华文彩云', 40), fg='purple').grid(row=0, column=3)
    """ 标题 """

    """ 主体 """
    # 主体应该是三个按钮
    # 提示
    tip = Label(root, text='%15s' % '请选择', font=('行楷', 20), fg='red').grid()

    # 按钮控件
    button_1 = Button(root, text='石头', font=('行楷', 20), command=button_click_1, activebackground='pink',
                      fg='blue').grid(row=1, column=1)
    button_2 = Button(root, text='剪刀', font=('行楷', 20), command=button_click_2, activebackground='pink', fg='blue')
    button_2.grid(row=1, column=2)
    button_3 = Button(root, text=' 布 ', font=('行楷', 20), command=button_click_3, activebackground='pink', fg='blue')
    button_3.grid(row=1, column=3)

    # 结果提示
    # 结果值 定义全局
    # globals()['result'] = StringVar()
    global result
    result = StringVar(root)
    result_tip = Label(root, textvariable=result, font=('华文彩云', 20), fg='orange').grid(row=2, column=1, columnspan=2)
    """ 主体 """

    # 显示窗口
    root.mainloop()

def button_click_1():
    global result
    res = game_judge(1)
    result.set(res)

def button_click_2():
    global result
    res = game_judge(2)
    result.set(res)

def button_click_3():
    global result
    res = game_judge(3)
    result.set(res)

def game_judge(player_nist):
    """ 猜拳逻辑
    :param player_nist: 玩家出的拳 1.石头 2.剪刀 3.布
    :return 比赛结果
    """
    # 模拟电脑出拳
    # TODO 电脑可以设置难度 初步方案可以直接概率胜,或者AI分析
    # 这里采用随机数random 1.石头 2.剪刀 3.布
    cpu_nist = random.randint(1, 3)

    # 把1 2 3转化成石头 剪刀 布 用字典能很好解决这个问题
    nist_dict = {
     1: '石头', 2: '剪刀', 3: '布'}

    # 判断逻辑 不难发现想赢只有三种 石头->剪刀。。。即player_nist-cpu_nist==-1 or 2
    sub = player_nist - cpu_nist
    if sub == -1 or sub == 2:
        # 赢了
        res = name + '出了' + nist_dict[player_nist] + '\n 电脑出了' + nist_dict[cpu_nist] + "\n恭喜你赢啦(●'◡'●)"
    elif sub == 0:
        # 平局
        res = name + '出了' + nist_dict[player_nist] + '\n 电脑出了' + nist_dict[cpu_nist] + '\n平局,有点菜哦o(* ̄▽ ̄*)ブ'
    else:
        # 输了
        res = name + '出了' + nist_dict[player_nist] + '\n 电脑出了' + nist_dict[cpu_nist] + '\n小菜鸡,再去练几年吧q(≧▽≦q)'
    return res

if __name__ == '__main__':
    create_tk()

记录自己成长点滴,也分享给大家学习的心得

(期盼带给你欢乐,祝你学习愉快~)

你可能感兴趣的:(PyCharm,小游戏)