python3-GUI概述及应用

news2025/2/28 0:11:21

目录

  • 一、什么是GUI
  • 二、Python GUI
  • PySimpleGUI概述
    • 一、PySimpleGUI简介
    • 二、PySimpleGUI特征
    • 三、输出设备
    • hello,world
    • 猜数字
      • 一、玩家猜数字
      • 二、电脑猜数字
    • 21点游戏
      • 一、21点游戏简介
      • 二、程序代码

一、什么是GUI

图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。
图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,底层应用的是计算机图形学的技术。

二、Python GUI

Python主要有以下GUI库:
1、Tk/Tcl
Tk/Tcl长期以来一直是Python不可或缺的一部分。它提供了一个健壮且独立于平台的窗口工具包,Python程序员可以使用tkinter包及其扩展tkinter来使用该工具包。Tix和tkinter。ttk模块。
tkinter包是Tcl/Tk之上的一个面向对象的薄层。要使用tkinter,不需要编写Tcl代码,但需要参考Tk文档,偶尔也需要参考Tcl文档。tkinter是一组包装器,将Tk小部件实现为Python类。此外,内部模块_tkinter提供了一个线程安全机制,允许Python和Tcl交互。
tkinter的主要优点是速度快,并且通常与Python捆绑在一起。
2、PyGObject
PyGObject使用GObject为C库提供了内省绑定。其中一个库是GTK+ 3小部件集。GTK+附带的小部件比Tkinter提供的要多得多。
3、PyGTK
PyGTK为旧版本的库GTK+ 2提供了绑定。它提供了一个面向对象的接口,其级别略高于C接口。也有到GNOME的绑定。
4、PyQt
PyQt是对Qt工具包的封装绑定。Qt是一个广泛的c++ GUI应用开发框架,可用于Unix, Windows和Mac OS x。sip是一个为Python类生成c++库绑定的工具,是专门为Python设计的。
5、PyQt
PyQt是对Qt工具包的封装绑定。Qt是一个广泛的c++ GUI应用开发框架,可用于Unix, Windows和Mac OS x。sip是一个为Python类生成c++库绑定的工具,是专门为Python设计的。
6、wxPython
wxPython是一个跨平台的Python GUI工具包,它是围绕流行的wxWidgets(以前是wxWindows) c++工具包构建的。它通过尽可能地使用每个平台的本机小部件(类Unix系统上的GTK+),为Windows、Mac OS X和Unix系统上的应用程序提供本机外观和感觉。除了一组广泛的小部件外,wxPython还提供了用于在线文档和上下文敏感帮助、打印、HTML查看、低层设备上下文绘制、拖放、系统剪贴板访问、基于xml的资源格式等的类,包括一个不断增长的用户贡献模块库。
7、Web (Remi)
Remi是一个用于在web浏览器中呈现Python应用程序的GUI库。这允许您在本地和远程访问您的接口。
8、PySimpleGUI
在2018年推出,创建自定义GUI的超级简单,非常适合初学者和高级GUI程序员。它通过使用初学者能够理解的Python核心数据类型(列表和字典),简化窗口定义,并通过将事件处理从基于回调的模型更改为传递消息的模型,可以进一步简化事件处理。

PySimpleGUI概述

一、PySimpleGUI简介

PySimpleGUI是一个Python包,它允许所有级别的Python程序员创建gui。与直接使用底层框架编写相比,PySimpleGUI代码更简单、更短,因为PySimpleGUI实现了许多“样板代码”。此外,接口被简化为需要尽可能少的代码来获得期望的结果。根据所使用的程序和框架,一个PySimpleGUI程序可能需要1/2到1/10的代码量来直接使用其中一个框架创建一个相同的窗口。
PySimpleGUI可以使用包含小部件(在PySimpleGUI中称为“元素”)的“布局”来指定GUI窗口,布局用于创建一个窗口,使用支持的4个框架之一来显示和与窗口交互。支持的框架包括tkinter、Qt、WxPython或Remi。虽然目标是封装/隐藏运行在GUI框架上的特定对象和代码,但如果需要,可以直接访问框架的依赖小部件和窗口。

二、PySimpleGUI特征

PySimpleGUI具有以下特征:
1、将tkinter、Qt、WxPython和Remi(基于浏览器)GUI框架转换为更简单的界面。通过使用初学者能够理解的Python核心数据类型(列表和字典),窗口定义得到了简化。
2、通过将事件处理从基于回调的模型更改为传递消息的模型,可以进一步简化事件处理。
3、代码不需要具有面向对象的体系结构,从而使包可以被更大的受众使用。
4、虽然体系结构很容易理解,但它并不一定只能在处理简单的问题。

三、输出设备

1、桌面GUI。
2、web浏览器中运行GUI。可通过PySimpleGUIWeb,运行一个永远不会退出的Web程序,在WEB端输出,这种情况最适合没有显示器的应用,如树莓派的核心机器人或其他设计,然后使用浏览器转到运行PySimpleGUI的硬件设备IP地址(和端口#),就可连接到应用程序,与应用程序进行通信,使用它进行配置更改,甚至可以使用Web GUI中的按钮控制机器人或其他硬件。

hello,world

一、PySimpleGui的安装与配置
如果系统中只有Python3版本,则可运行下面2个命令中任一个,否则运行第2个命令,完成安装与配置。
pip install pysimplegui
pip3 install pysimplegui
二、简单的hello,world
程序2-8-3-1.py的功能是,在屏幕上显示一个hello,world的窗口。用户按OK按钮后退出程序。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-8-3-1.py
import PySimpleGUI as sg                        # 第1部分-导入
# 定义窗口内容
layout = [  [sg.Text("hello,world")],     # 第2部分 - 指定布局(The Layout)
            [sg.Text("你好,世界")],
            [sg.Button('Ok')] ]
# 创建窗口
window = sg.Window('hello', layout)      # 第3部分-窗口定义

#显示和与窗口交互
event, values  = window.read()     # 第4部分-事件循环或调用window.read

#最后从屏幕上移除
window.close()                    # 第5部分-关闭窗口

程序2-8-3-1.py分为5个部分:
1、第1部分导入PySimpleGUI,别名为sg。
2、第2部分定义窗口内容,实质就是指定窗口的布局layout。
窗口总体从上到下分为3个内容:文本框"hello,world"、文本框"你好,世界"以及OK按钮。
3、第3部分使用第2部分定义的窗口布局layout,创建窗口。
4、第4部分创建事件循环或调用window.read,这样窗口才可以显示。其中,事件在
5、第5部分关闭窗口。
程序运行结果如下图所示:
在这里插入图片描述

程序2-8-3-2.py的功能是,在屏幕上显示一个hello,world的窗口,但增加一个用户输入的部分,让用户可输入自己的名字,并在用户按OK按钮后退出程序前在控制台输出用户名字,向用户问好。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-8-3-1.py
import PySimpleGUI as sg                          # 第1部分-导入

# 定义窗口内容
layout = [  [sg.Text("hello,world")],       # 第2部分 - 指定层次(The Layout)
            [sg.Text("你好,世界")],
            [sg.Text("如何称呼您?")],     
            [sg.Input()],            
            [sg.Button('Ok')] ]

# 创建窗口
window = sg.Window('hello world', layout)      # 第3部分-窗口定义


#显示和与窗口交互
event, values  = window.read()                   # 第4部分-事件循环或调用window.read

print(values[0],",很高兴认识您!")
#最后从屏幕上移除
window.close()                                   # 第5部分-关闭窗口

程序2-8-3-1.py分为5个部分:
6、第1部分导入PySimpleGUI,别名为sg。
7、第2部分定义窗口内容,实质就是指定窗口的布局layout。
窗口总体从上到下分为5个内容:文本框"hello,world"、文本框"你好,世界"、文本框"如何称呼您"以及OK按钮。
8、第3部分使用第2部分定义的窗口布局layout,创建窗口。
9、第4部分创建事件循环或调用window.read,这样窗口才可以显示,才可以接受用户交互输入。其中,事件在event中,而交互输入结果在values中。
10、第5部分关闭窗口。

程序2-8-3-2.py运行结果如下图所示。
在这里插入图片描述

控制台输出结果如下:
张三 ,很高兴认识您!

猜数字

猜数字游戏就是1-100中随机产生一个数字,然后开始猜产生的数字是多少,当猜的数字比实际数字大时,提示玩家数字大了,当猜的数字比实际数字小时,提示玩家数字小了,当猜的数字正好是实际数字时,游戏挑战成功。

一、玩家猜数字

代码2-8-4-1.py演示了由玩家(人类)猜数字游戏。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-8-4-1.py
import PySimpleGUI as sg     
import random as rnd


playNum=rnd.randint(1,100)
gameShowMess=["猜对了,新的随机数已经重新生成!","您猜的数字大了","您猜的数字小了"]
# 定义窗口内容
layout = [  [sg.Text("计算机随机生成1-100以内的一个数字。\n请您猜测这个数字是多少?")],      
            [sg.Text("请输入您猜的数字")],     
            [sg.Input()],        
            [sg.Text(size=(40,2), key='-OUTPUT-')],
            [sg.Button('Ok'), sg.Button('Cancel')] ]
# 创建窗口
window = sg.Window('猜数字游戏', layout)      
#显示和与窗口交互
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Cancel': 
        break
    guessNum=int(values[0])
    gameState=guessNum-playNum
    if gameState>0: 
        gameState=1
    elif gameState<0:
        gameState=2  
    else:
        playNum=rnd.randint(1,100)
    window['-OUTPUT-'].update('你猜的数字是: ' + str(guessNum) + "!\n"+gameShowMess[gameState])

               

print(values[0])
#最后从屏幕上移除
window.close()     

代码2-8-4-1.py的执行结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码2-8-4-1.py的执行过程如下:
1、导入PySimpleGUI库,以便后面调用其GUI功能,再导入random库,以便后面调用其随机数功能。
2、先定义变量playNum,取值为1到100内的随机数;再定义gameShowMess,存放猜数结果提示消息,这个变量是一个列表,第0个元素表示猜数成功,第1个元素表示猜的数字大了,第2个元素表示猜的数字小了。
3、定义窗口内容,从上到下有以下构件:
(1)2个文本,分别提示抽数规则和玩家输入数字。
(2)1个输出框,接受玩家输入猜测的数字。
(3)1个文本框,用于显示游戏过程。
(4)从左到右2个按钮,分别为确定和取消。
4、根据第3步定义的窗口内容,创建窗口。
5、显示窗口和与窗口交互。
(1)创建while循环,循环条件为永远为True
(2)循环体完成以下功能:
首先,读取窗口事件(OK或cancel按钮以及窗口事件)和窗口交互输入内容(猜的数字);接着,对事件进行判断,如果玩家点击了cancel按钮或关闭窗口,则退出循环,这也是退出第(1)步创建的循环的唯一方法;然后,得到玩家输入的猜的数字到变量guessNum中,并计算猜数和实际数的差额存到变量gameState中;再然后,对gameState差额进行分析,如果猜数大了或小了,重新设置gameState值,该值用于访问gameShowMess列表的索引,以便显示相应的猜数结果(取自gameShowMess列表)。
如果猜数大了,索引为1;如果猜数小了,索引为2;否则就是猜中了,索引为0(不用重新设置,因为gameState在前一步计算时已经为0)。此外,如果结果是猜中了,则重新生成随机数,开始新一轮的游戏;最后,根据gameState值在用于显示游戏过程的文本构件中更新本轮猜数情况。
6、循环结束,从屏幕上移除窗口。

二、电脑猜数字

1、二分法
在数学领域中,对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
将数学意义上的二分法扩展一下,形成二分查找法:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2、自动猜数字算法
该算法的过程如下:
(1)生成需要猜的随机数或由玩家输入要猜的数为A。
(2)设置数的查找范围为[a,b]。
(3)从这一步开始,应用二分查找法找到正确的猜数。取[a,b]的中间int((a+b)/2),将该位置设置为中间位置,取中间位置的数B与要猜的随机数A对比,对比有3种结果:相等、B大了、B小了。
(4)如果对比结果为相等,则算法结束,找到要猜的数。
(5)如果对比结果为B大了,则将b设为B,如果对比结果为B小了,则将a设为B。这样新的查找范围更新缩小了很多。
(6)回到第(3)步,继续下一轮二分查找。
3、代码实现
程序2-8-4-2.py实现了自动猜数字算法。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#2-8-4-2.py
import PySimpleGUI as sg     
import random as rnd
import time



guessNum=rnd.randint(1,100)
gameShowMess=["猜对了!","猜的数字大了","猜的数字小了"]
# 定义窗口内容
layout = [  [sg.Text("请输入您要机器猜的数字(1-100)")],     
            [sg.Input()],        
            [sg.Output(size=(40,2), key='-OUTPUT-')],
            [sg.Button('Ok'), sg.Button('Cancel')] ]

# 创建窗口
window = sg.Window('猜数字游戏', layout)      

minNum=1
maxNum=100

#显示和与窗口交互
while True:
    isGameContinue=True
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Cancel': 
        break
    playNum=int(values[0])
    gameState=guessNum-playNum
    while isGameContinue and playNum>=1 and  playNum<=100:  
        gameState=guessNum-playNum
        if gameState>0: 
            gameState=1
            maxNum=guessNum
            
        elif gameState<0:
            gameState=2  
            minNum=guessNum

        else:
            minNum=1
            maxNum=100  
            isGameContinue=False   
        window['-OUTPUT-'].update(window['-OUTPUT-'].Get()+'机器猜的数字是: ' + str(guessNum) + "!"+gameShowMess[gameState])
        guessNum=int((minNum+maxNum)/2)
               


#最后从屏幕上移除
window.close()           

程序2-8-4-2.py的执行结果如下:
在这里插入图片描述

程序2-8-4-2.py执行过程如下:
1、导入PySimpleGUI库,以便后面调用其GUI功能,再导入random库,以便后面调用其随机数功能。
2、先定义变量guessNum,取值为1到100内的随机数,此变量表示机器猜的数字,并非实际数;再定义gameShowMess,存放猜数结果提示消息,这个变量是一个列表,第0个元素表示猜数成功,第1个元素表示猜的数字大了,第2个元素表示猜的数字小了。
3、定义窗口内容,从上到下有以下构件:
(1)1个文本,提示玩家要机器猜的数字(1-100)。
(2)1个输入框,接受玩家输入猜测的数字。
(3)1个输出框,用于显示游戏过程。
(4)从左到右2个按钮,分别为确定和取消。
4、 根据第3步定义的窗口内容,创建窗口,并定义minNum(用于二分法的查找范围的最小数)和maxNum(用于二分法的查找范围的最大数)共2个变量值分别为1和100。
5、 创建while循环(此循环为外循环),显示窗口和与窗口交互。
(1) 将循环条件设为True,接着,开始如下循环:
(2) 读取窗口事件(OK或cancel按钮以及窗口事件)和窗口交互输入内容(猜的数字)
(3) 对事件进行判断,如果玩家点击了cancel按钮或关闭窗口,则退出循环。
(4) 将机器自动猜的数字到变量guessNum中,计算猜数和实际数的差额存到变量gameState中。
(5) 再定义一个循环体(此循环体为内循环),此时形成了内外2个循环体:外循环开始处使用event读取玩家事件,values接受玩家输入,以及初始化内循环需要条件isGameContinue(设置为True,以便内循环体首次可运行);内循环体的条件是isGameContinue and playNum>=1 and playNum<=100(and表示而且),其中,isGameContinue表示猜数是否继续(为True表示继续), playNum>=1 and playNum<=100表示玩家给出要猜的数字在1-100之内。
内循环体内容如下:
①计算猜数和实际数的差额存到变量gameState中。
②对gameState差额进行分析,如果猜数guessNum大或小了,重新设置gameState值,该值用于访问gameShowMess列表的索引,以便显示相应的猜数结果(取自gameShowMess列表)。
如果猜数guessNum大了,索引为1,变量maxNum值设为猜数guessNum;如果猜数guessNum小了,索引为2,变量minNum值设为猜数guessNum;否则就是猜中了,索引为0(不用重新设置,因为gameState在前一步计算时已经为0),将变量minNum初始化为1,变量maxNum初始化为100,并将内循环条件isGameContinue设置为False,表示结束内循环,程序重新回到外循环体起始处执行,程序将提示玩家输入新要猜的数字,开始新一轮的游戏。
③根据gameState值在输出构件中更新本轮游戏猜数情况。
④计算机器下次猜的数字,取查找范围的中间数字,即:int((minNum+maxNum)/2)
6、外循环结束,从屏幕上移除窗口。

21点游戏

一、21点游戏简介

21点又名BlackJack,。该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大,以游戏只有2个人为例,在不超过21点的情况下,大者胜利,如果以一方超过21点,则该失败,另一方赢得此局,游戏中的任何一方可以选择在某轮终止抽牌。2至9牌,按其原点数计算;K、Q、J和10牌都算作10点(一般记作T,即ten之意);A 牌(ace)算作1点。
为方便程序设计与讲解,在此将扑克牌使用数字代替,并将规则改为:玩家和电脑轮流从1-10中抽取1个数,使手中的数之和不超过21点且尽量大,游戏中的任何一方可以选择在某轮终止抽牌。

二、程序代码

#      /usr/bin/env python3
# -*- coding: utf-8 -*-
#2-8-4-2.py
import PySimpleGUI as sg     
import random as rnd
import time
from enum import Enum


playerNums=[]
playerNumSum=0
computerNums=[]
computerNumSum=0
computerWin=False
playerWin=False
GamePlayer=Enum('GamePlayer', 'COMPUTER PLAYER')
gameShowMess=["玩家停止抽数!","玩家继续抽数:","电脑停止抽数","电脑继续抽数:"]

def UpdateStatus(statusStr,window):
    window['-OUTPUT-'].update(statusStr+ "\n"+window['-OUTPUT-'].Get())

    
def AddRndNum(gamePlayer):
    global  playerNumSum,computerNumSum
    if gamePlayer==GamePlayer.COMPUTER:
        computerNum=rnd.randint(1,10)
        computerNums.append(computerNum)  
        computerNumSum+=computerNum
        return computerNum   
    else:            
        playerNum=rnd.randint(1,10)
        playerNums.append(playerNum)
        playerNumSum+=playerNum
        return playerNum

def AddPlayerNum(window):
    nRes=AddRndNum(GamePlayer.PLAYER)
    UpdateStatus(gameShowMess[1] + str(nRes) + "      总点数:"+ str(GetPlayerSum()),window) 
    return GetPlayerSum()
    
    
def AddComputerNum(window):
    nRes=AddRndNum(GamePlayer.COMPUTER)
    UpdateStatus(gameShowMess[3] + str(nRes) + "      总点数:"+ str(GetComputerSum()),window) 
    return GetComputerSum()
    
def GetPlayerSum():
    return playerNumSum
def GetComputerSum():
    return computerNumSum
    
def isGameOver(isGameContine):
    computerWin=playerWin=gameOver=False
    if  GetPlayerSum()>21 and GetComputerSum()<=21 :
        computerWin=True 
        playerWin=False  
        gameOver=True
    elif  GetComputerSum()>21 and GetPlayerSum()<=21:
        computerWin=False 
        playerWin=True 
        gameOver=True
    elif  GetComputerSum()>=21 and GetPlayerSum()>=21:
        gameOver=True
    elif (not isGameContine):
        if  GetComputerSum()>GetPlayerSum():
            computerWin=True
            playerWin=False 
            gameOver=True  
        elif GetComputerSum()==GetPlayerSum():
            gameOver=True  
        else:
            computerWin=False 
            playerWin=True 
            gameOver=True   
        
    return (computerWin,playerWin,gameOver)

def main():   
    global playerNums,playerNumSum,computerNums,computerNumSum,computerWin,playerWin

    # 定义窗口内容
    layout = [  [sg.Text("您是否继续抽数?")],            
                [sg.Button('Yes'), sg.Button('No'),sg.Button('Exit')],
                [sg.Output(size=(40,2), key='-OUTPUT-')]]
    
    # 创建窗口
    window = sg.Window('21点游戏', layout)      
    
    isComputerContinue=True
    isPlayerContinue=True
    #显示和与窗口交互
    while True:
        if isPlayerContinue:
            event, values = window.read()
        if event == sg.WIN_CLOSED or event == 'Exit': 
            break
        if isPlayerContinue: 
            if event == 'Yes':
                UpdateStatus("玩家确定抽数",window)
            elif event == 'No':
                UpdateStatus("玩家放弃抽数",window)  
                isPlayerContinue=False      
        else:
            UpdateStatus("玩家放弃抽数",window)
            
        if isComputerContinue and GetComputerSum()<17:
            UpdateStatus("电脑确定抽数",window) 
        else:
            UpdateStatus("电脑放弃抽数",window) 
            isComputerContinue=False
            
        if isPlayerContinue:  
            AddPlayerNum(window)
        if isComputerContinue :
            AddComputerNum(window)
        if isComputerContinue or isPlayerContinue:
            (cWin,pWin,isGameEnd)=isGameOver(True)
        else:
            (cWin,pWin,isGameEnd)=isGameOver(False)
            isGameRestart=True         
        isGameRestart=False
        if pWin:
            UpdateStatus("玩家赢了",window)
            isGameRestart=True          
        elif cWin:
            UpdateStatus("电脑赢了",window)  
            isGameRestart=True 
        
        if (not pWin) and (not cWin) and isGameEnd:
            UpdateStatus("电脑和玩家都没有赢",window)
            isGameRestart=True 

                
           
        if  isGameRestart:
            UpdateStatus(" 玩家总点数:"+ str(GetPlayerSum())+"!电脑总点数:"+ str(GetComputerSum()),window) 
            isComputerContinue=True
            isPlayerContinue=True
            playerNums=[]
            playerNumSum=0
            computerNums=[]
            computerNumSum=0
            computerWin=False
            playerWin=False  
            UpdateStatus("游戏重新开始",window)


  


                
    
    
    #最后从屏幕上移除

    window.close()   

if __name__ == "__main__":
    main()
    exit()

在这里插入图片描述

游戏重新开始
玩家总点数:20!电脑总点数:20
电脑和玩家都没有赢
电脑放弃抽数
玩家放弃抽数
玩家继续抽数:5 总点数:20
电脑放弃抽数
玩家确定抽数
电脑继续抽数:5 总点数:20
玩家继续抽数:1 总点数:15
电脑确定抽数
玩家确定抽数
电脑继续抽数:1 总点数:15
玩家继续抽数:3 总点数:14
电脑确定抽数
玩家确定抽数
电脑继续抽数:3 总点数:14
玩家继续抽数:1 总点数:11
电脑确定抽数
玩家确定抽数
电脑继续抽数:7 总点数:11
玩家继续抽数:9 总点数:10
电脑确定抽数
玩家确定抽数
电脑继续抽数:4 总点数:4
玩家继续抽数:1 总点数:1
电脑确定抽数
玩家确定抽数
游戏重新开始
玩家总点数:21!电脑总点数:22
玩家赢了
电脑继续抽数:9 总点数:22
玩家继续抽数:3 总点数:21
电脑确定抽数
玩家确定抽数
电脑继续抽数:4 总点数:13
玩家继续抽数:8 总点数:18
电脑确定抽数
玩家确定抽数
电脑继续抽数:9 总点数:9
玩家继续抽数:10 总点数:10
电脑确定抽数
玩家确定抽数

对2-8-4-2.py分析如下:
1、导入程序需要使用的库。
(1)导入GUI库PySimpleGUI,并指定别名为sg。
import PySimpleGUI as sg
(2)导入随机数库random
import random as rnd
(3)导入时间库time
Import time
time 模块可进行时间处理,也可转换时间格式。
(4)导入enum枚举库
from enum import Enum
枚举是与多个唯一常量值绑定的一组符号名(即成员)。枚举中的成员可以进行身份比较,并且枚举自身也可迭代。enum定义了4个枚举类,可定义名称与值的唯一组合,它们是 Enum、IntEnum、Flag 和 IntFlag。
class enum.Enum用于创建枚举常量的基类;class enum.IntEnu用于创建 int 子类枚举常量的基类;class enum.IntFlag用于创建可与位运算符搭配使用,又不失去 IntFlag 成员资格的枚举常量的基类;class enum.Flag用于创建可与位运算符搭配使用,又不会失去 Flag 成员资格的枚举常量的基类。
2、定义游戏用变量
(1)抽数列表变量,存储玩家每轮抽取的数字,每个元素为玩家本轮每次抽取的数字。
playerNums=[]
(2)本轮抽数总计。
playerNumSum=0
(3)抽数列表变量,存储电脑每轮抽取的数字,每个元素为电脑本轮每次抽取的数字。
computerNums=[]
(4)电脑本轮抽数总计。
computerNumSum=0
(5)电脑赢取游戏否
computerWin=False
(6)玩家赢取游戏否
playerWin=False
(7)游戏玩家的枚举变量
GamePlayer=Enum(‘GamePlayer’, ‘COMPUTER PLAYER’)
Enum 类属于可调用对象,它提供了功能性 API,可直接使用Enum函数创建枚举。比如下面代码段,首先通过Enum(‘Animal’, ‘ANT BEE CAT DOG’)定义动物枚举变量Animal,该变量包括ANT、BEE、CAT、DOG共4种动物;接着通过Animal.ANT输出ANT枚举名和枚举值,通过 Animal.ANT.value输出ANT的枚举值;最后,通过list函数将Animal变量转化为列表类型,并输出4个枚举成员。

>>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
>>> Animal
<enum 'Animal'>
>>> Animal.ANT
<Animal.ANT: 1>
>>> Animal.ANT.value
1
>>> list(Animal)
[<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

(8)定义提示信息列表,每个元素为需要显示的文本提示。
gameShowMess=[“玩家停止抽数!”,“玩家继续抽数:”,“电脑停止抽数”,“电脑继续抽数:”]
3、定义刷新提示消息的函数UpdateStatus。

def UpdateStatus(statusStr,window):
   window['-OUTPUT-'].update(statusStr+ "\n"+window['-OUTPUT-'].Get())

其中,window[‘-OUTPUT-’] 表示GUI中关键字为“-OUTPUT-”的组件,该组件是OUTPUT组件,具有快速添加在窗口中显示滚动文本的能力, 用户将在窗口内看到一个滚动的文本区域。
观察UpdateStatus函数体代码,通过对window[‘-OUTPUT-’]的update方法调用,完成消息更新,调用参数是需要显示的文本字符串。也可通过print函数完成更新,任何“打印”的内容都将显示在这个元素中, 也是一种显示滚动文本的“简单”方法。 上面函数体也可如下定义:

def UpdateStatus(statusStr,window):
  print(statusStr)

4、抽数并更新游戏点数的函数 AddRndNum。

def AddRndNum(gamePlayer):
    global  playerNumSum,computerNumSum
    if gamePlayer==GamePlayer.COMPUTER:
        computerNum=rnd.randint(1,10)
        computerNums.append(computerNum)  
        computerNumSum+=computerNum
        return computerNum   
    else:            
        playerNum=rnd.randint(1,10)
        playerNums.append(playerNum)
        playerNumSum+=playerNum
        return playerNum

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十六、CANdelaStudio深入-CDD与CDDT的差异(新建自定义服务)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的CDD与CDDT的差异与新建自定义服务,欢迎…

数字图像处理(一)——什么是数字图像

一、什么是数字图像处理&#xff1f; 一副图像可以被定义为一个二维函数f(x,y)&#xff0c;其中x和y是空间平面坐标&#xff0c;而对任意一对空间坐标(x,y)处幅值f称为图像在该点的强度或者灰度。当x和y以及灰度值f是有限的离散数值时&#xff0c;我们称该图像为数字图像。像素…

排序算法简述

一、概述 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、基数排序&#xff0c;这些排序各自有各自的特点。按照时间时间复杂度可以分为 O(n^2):冒泡、插入、选择排序&#xff1b;O(nlogn):归并、快速排序&#xff1b;O(n):桶排序、计数排序、基…

[附源码]java毕业设计自治小区物业设备维护管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]Python计算机毕业设计房地产销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

SSM+Mysql实现的共享单车管理系统(功能包含分角色,登录、用户管理、服务点管理、单车管理、分类管理、学生信息管理、单车租赁、信息统计、系统设置等)

博客目录SSMMysql实现的共享单车管理系统实现功能截图系统功能使用技术代码完整源码SSMMysql实现的共享单车管理系统 本系统一个学校共享单车管理的项目&#xff0c;通过线上系统化的管理&#xff0c;可以为后续的运营以及单车的项目运转提供极大的帮助。 (文末查看完整源码) …

【计算机视觉(CV)】基于图像分类网络VGG实现中草药识别(二)

【计算机视觉&#xff08;CV&#xff09;】基于图像分类网络VGG实现中草药识别&#xff08;二&#xff09; 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项…

Graph (discrete mathematics)

In mathematics, and more specifically in graph theory, a graph is a structure amounting to a set of objects in which some pairs of the objects are in some sense “related”. The objects correspond to mathematical abstractions called vertices (also called n…

餐厅食材采购信息管理系统的设计与实现

摘 要 网络的广泛应用给生活带来了十分的便利。所以把餐厅食材采购信息管理与现在网络相结合&#xff0c;利用JSP技术建设餐厅食材采购信息管理系统&#xff0c;实现餐厅食材采购的信息化。则对于进一步提高餐厅食材采购信息管理发展&#xff0c;丰富餐厅食材采购信息管理经验…

SpringBoot SpringBoot 原理篇 3 核心原理 3.5 启动流程【4】【5】【6】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇3 核心原理3.5 启动流程【4】【5】【6】3.5.1 看源码咯3.5.2 总结3 核心原理 …

剑指 Offer 10- I. 斐波那契数列

一、题目描述 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xff09;。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和…

leetcode:6248. 统计中位数为 K 的子数组【问题转化 + 排序二分】

目录题目截图题目分析ac code总结题目截图 题目分析 找到k的位置然后一步步往左走&#xff0c;一步步往右走统计左边和右边的比当前k小的和比k大的lst [[small, big]]&#xff0c;分为left和right两部分可以先一侧的单独看small和big&#xff0c;找到big - small 0或者1的即…

NETCONF、RESTCONF和YANG

目录 一、NETCONF、RESTCONF和YANG是之间什么关系&#xff1f; 二、Netconf简介 2.1、一般使用工具&#xff1a;MG-Soft 简介 三、Netconf YANG 原理与实践 3.1、NETCONF协议 3.2、YANG建模语言 3.3、RESTCONF协议 网管协议&#xff1a; SNMP&#xff08;基于UDP&#…

C++员工考勤管理系统

目录 1 考勤管理系统的设计 1 1.1 需求分析 1 1.2 功能模块构成 1 1.3 数据库结构设计 2 2 考勤管理系统的实现 4 2.1 系统登陆功能的实现 4 2.2 基本信息管理模块 5 4.2.1 节假日信息管理 5 4.2.2 部门信息管理 6 4.2.3 员工信息管理 8 2.3 考勤管理模块 10 4.3.1 出勤信息管理…

怎么才能学会Python?

前言 新手小白学Python在还没有人带的情况下很容易半途而废&#xff0c;首先给大家总结一下我这两年Python的学习、开发经验遇到一些问题&#xff0c;大家首先得正视这些问题&#xff0c;因为超90%的人在初学Python时都会也遇到。 ①自学网上资料多&#xff0c;但质量参差不齐…

[报错解决](Error Creating bean with name ‘xxx‘)类问题解决思路

遇到Error Creating bean with name ’ 这类问题的解决思路 错误日志关键部分&#xff1a; org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name productHandler: Unsatisfied dependency expressed through field productMap…

【vue】实现打印功能

文章目录一、vue-print-nb【1】安装【2】引用【3】API【4】示例代码【5】vue-print-nb插件的一些优化【6】注意事项&#xff1a;二、print.js &#xff1a;解决了无法打印本地图片的问题【1】安装【2】使用【3】注意点&#xff1a;三、lodop打印功能&#xff08;可以指定打印机…

困于二手电商打转,转转拿什么“拯救世界”?

“双碳”战略下&#xff0c;转转集团也加入了&#xff0c;从数据上来看做得还可以。 都知道&#xff0c;近期转转集团试图向市场讲新故事。11月7日&#xff0c;转转集团在北京举办了品牌升级发布会&#xff0c;会上宣布其不再是一家互联网电商公司&#xff0c;而是定位在一家循…

爱心动画效果,教你如何更改颜色背景的爱心

如何运行该代码&#xff1f; 方法一&#xff1a; 1.创建一个.txt文件 2.把代码复制粘贴cv进去&#xff0c;并将其保存下来ctrls 3.改后缀名&#xff0c;将.txt改为.html 此时图标变了 4.此时点击&#xff0c;即可看见爱心效果 方法二&#xff1a; vscode dddd&#x1…

《数据结构》八大排序(详细图文分析讲解)

目录 排序 排序的应用 排序简介 排序的分类 排序算法的好坏评判 冒泡排序法 思路分析 代码实现 选择排序法 思路分析 代码实现 插入排序 思路分析 代码实现 希尔排序 思路分析 代码演示 归并排序法 思路分析 代码演示 快速排序 思路分析 代…