欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用python创建桌面应用(一)

程序员文章站 2022-05-28 20:12:17
1.组织应用程序 我们刚学编程语言的时候,写的代码都是在一个文件中完成的。如果我们在开发一个项目的时候,这个就显得逻辑不清楚,看着很烦,根本就不想看。我们构建一个高效的,可扩展应...
1.组织应用程序

我们刚学编程语言的时候,写的代码都是在一个文件中完成的。如果我们在开发一个项目的时候,这个就显得逻辑不清楚,看着很烦,根本就不想看。我们构建一个高效的,可扩展应用的关键是应用分层架构,最常见的方法是把应用分为三层,用户界面层,核心逻辑层(业务逻辑层)和数据层。有的时候涉及到网络时,会有网络层。

用户界面应该为用户展示应用逻辑,但并不实现逻辑,这和我们学面向对象时的封装差不多。它的任务是尽可能简单的展示应用 的功能,并且尽可能清晰的展示结果和输出,和我们玩游戏一样,我只知道怎么玩,他是怎么做出来关我什么事。用户界面会控制在给定的时间点上哪些功能是可用的,比如说,我们在LOL的时候,不把buff打死,就不可能给你额外的加成一样。如果我们使用面向对象的程序,对象通常会表示类似菜单,按钮和窗口的东西。用户界面通过调用逻辑层提供的函数或方法访问核心逻辑层。

核心逻辑层包含所有数据的算法和状态管理。在该层,可以编写代码来改变数据值,创建新实体,打开或关闭文件等。说这么多这一层是干什么的呢?它的目的是提供一组用户界面可以访问的函数或服务。为了提高效率核心逻辑函数不应该打印结果,但是应该把它们作为值返回,就是说不要用print而是用return。用户界面可以在合适的地方将这些值,以适当的格式展现出来。核心逻辑层仅显示信息,它不关心信息的显示格式,就是这种把逻辑和显示分开,可以在相同核心逻辑层上创建不同的用户界面。核心逻辑层会操作数据层提供的数据。

数据层用于管理数据。他把数据存储在安全的地方并在需要时取回数据。它不应该包含复杂的算法或特定于应用的逻辑。它仅仅把原始数据传递到核心逻辑层来处理。数据层可能包含一些基本的数据完整性处理来确保数据的一致性。它可能也会集成一些安全功能,比如密码加密,权限控制等。它应该通过一组对象,函数或服务来显示数据。说了这么多,建议你使用数据库吧。

用户界面层,逻辑层和数据层之间的交互通常使用一个名为模型-视图-控制器(Model View Controller,MVC)的设计模式。大体上讲,模型代表核心逻辑层和数据层,而是视图代表用户界面的显示元素,控制器代表这些显示元素之间的交互和依赖。

这个项目是以一个游戏作为案列,叫tic-tac-toe。说白了就是我们中国人玩的井字棋。如果你要做游戏还是建议你使用python的pygame来做。

2.创建命令行界面

2.1创建数据层

创建游戏时,首先需要设计数据层。对于这个游戏需要一个简单的文本文件来保存游戏状态,这样就可以被保存和恢复使用。这个游戏里有9个正方形的面板,里面是空格或X,O字符。你高兴也可以换成其他的字符。我们可以用简单的字符串列表来表示这三个项。为了存储把列表转换为简单的字符串。

需要的另一个数据是下一步是哪个玩家,在人机游戏中,可以假设人永远是下一个玩家。所以我们的数据层接口中应提供两个方法:保存游戏(saveGame),恢复游戏(restoreGame)。

<span style="font-family:'KaiTi_GB2312';"><strong><span style="font-size:24px;">''' oxo_data is the data module for a tic-tac-toe (or OXO) game. 
    It saves and restores a game board. The functions are:
         saveGame(game) -> None
         restoreGame() -> game
    Note that no limits are placed on the size of the data.
    The game implementation is responsible for validating
    all data in and out.'''

import os.path
game_file = "oxogame.dat"

def _getPath():   #这是一个辅助函数  得到主目录,如果失败就使用当前目录
    ''' getPath -> string
    Returns a valid path for data file. 
    Tries to use the users home folder, defaults to cwd'''

    try:
        game_path = os.environ['HOMEPATH'] or os.environ['HOME']
        if not os.path.exists(game_path):
            game_path = os.getcwd()
    except (KeyError, TypeError):
        game_path = os.getcwd()
    return game_path

def saveGame(game):   #创建一个包含表示游戏的字符串的新文件
    ''' saveGame(game) -> None

    saves a game object in the data file in the users home folder.
    No checking is done on the input which is expected to
    be a list of characters'''
    
    path = os.path.join(_getPath(), game_file)
    try:
        with open(path, 'w') as gf:
           gamestr = ''.join(game)
           gf.write(gamestr)
    except FileNotFoundError:
        print("Failed to save file")

def restoreGame():  #定位到被保存的文件并打开,读取保存的游戏数据
    ''' restoreGame() -> game

    Restores a game from the data file.
    The game object is a list of characters'''
    
    path = os.path.join(_getPath(), game_file)    
    with open(path) as gf:
        gamestr = gf.read()
        return list(gamestr)

def test():
    print("Path = ", _getPath())
    saveGame(list("XO XO XO "))
    print(restoreGame())

if __name__ == "__main__": test()
</span></strong></span>

上面的这个文件的文件名为oxo_data.py