首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成在线播放器映像的“我的世界”服务器查询器

生成在线播放器映像的“我的世界”服务器查询器
EN

Code Review用户
提问于 2017-01-27 03:59:52
回答 1查看 216关注 0票数 3

这段代码在我的桌面上每10秒运行一次。它根据在线玩家列表生成一个有多达6个玩家脸的PNG。

这段代码有什么方法可以更快地执行吗?有什么评论吗?

每个玩家都有自己的头像脸的PNG,标题是:"username_face.png“--当玩家在线时,这些图片被粘贴到主图像中。

我编写了这个脚本,将他们的脸编译成一个图像,在一个名为conky的程序中显示,允许我将在线播放器显示为桌面的一部分。

代码语言:javascript
复制
from mcstatus import MinecraftServer
import os
from PIL import Image

#Query the server and get player names.
server = MinecraftServer("123.123.123.123", 25565)
query = server.query()
nameList = query.players.names


#Sort the list of player names.
nameList.sort()

#Open our temporary file for storing player names.
tempFile = open('server1_previous_players.txt', 'r')
oldNameList = tempFile.read().splitlines()
tempFile.close()

def createImage(players):
    #create a blank transparent image with the dimensions: 212x147px.
    baseImage = Image.new("RGBA", (212, 147))
    slotList = [(17, 17), (82, 17), (147, 17), (17, 82), (82, 82), (147, 82)]

    if len(players) > 0:
        for x in range(0, 6):
            try:
                face = Image.open(str(nameList[x]).lower() + "_face.png", 'r')
                baseImage.paste(face, slotList[x])
            except:
                break

    baseImage.save("server1_online.png")

#If nothing changed, pass!
if nameList == oldNameList:
    print("same thing!")
    pass

#Else, if no-one is on, but the text file says people are on, empty the text file.
elif len(nameList) == 0 and len(oldNameList) > 0:
    print("everyone left :'(")
    tempFile = open('server1_previous_players.txt', 'w')
    createImage(nameList)

#Else, if at least 1 person is on, generate a new image accordingly.
elif len(nameList) > 0:
    tempFile = open('server1_previous_players.txt', 'w')
    print('\n'.join(nameList), file=tempFile)
    createImage(nameList)

else:
    pass
EN

回答 1

Code Review用户

发布于 2017-01-27 12:55:58

也许这不会提高性能,但我有一些一般性的建议:

使用while循环而不是for-loops和break。它将使您的代码更具可读性。我已经为您重写了createImage函数:

代码语言:javascript
复制
def createImage(players):
    # create a blank transparent image with the dimensions: 212x147px.
    baseImage = Image.new("RGBA", (212, 147))
    slotList = [(17, 17), (82, 17), (147, 17), (17, 82), (82, 82), (147, 82)]

    x = 0
    while x < len(players) and x < 6:
        face = Image.open(str(players[x]).lower() + "_face.png", 'r')
        baseImage.paste(face, slotList[x])
        x += 1
    baseImage.save("server1_online.png")

如果您更喜欢for而不是while,您可以使用:

代码语言:javascript
复制
def createImage(players):
    # create a blank transparent image with the dimensions: 212x147px.
    baseImage = Image.new("RGBA", (212, 147))
    slotList = [(17, 17), (82, 17), (147, 17), (17, 82), (82, 82), (147, 82)]

    for slot, player in zip(slotList, players):
        face = Image.open(str(player).lower() + "_face.png", 'r')
        baseImage.paste(face, slot)
    baseImage.save("server1_online.png")

阅读更多关于zip 这里的信息

您需要关闭您打开的文件:

代码语言:javascript
复制
# If nothing changed, pass!
if nameList == oldNameList:
    print("same thing!")

# Else, if no-one is on, but the text file says people are on, empty the text file.
elif len(nameList) == 0 and len(oldNameList) > 0:
    print("everyone left :'(")
    tempFile = open('server1_previous_players.txt', 'w')
    tempFile.write("")
    tempFile.close()
    createImage(nameList)

# Else, if at least 1 person is on, generate a new image accordingly.
elif len(nameList) > 0:
    tempFile = open('server1_previous_players.txt', 'w')
    # write should be used instead of print
    tempFile.write('\n'.join(nameList))
    tempFile.close()
    createImage(nameList)

可以不使用if-statement,所以如果只有传入,您就不需要它了。

如果您想在无人打开时创建一个空/透明映像,可以将这两个elif-statements组合在一起:

代码语言:javascript
复制
# If nothing changed, pass!
if nameList == oldNameList:
    print("same thing!")


# else generate image and write new player list to file
else:
    if len(nameList) == 0 and len(oldNameList) > 0:
        print("everybody left")
    tempFile = open('server1_previous_players.txt', 'w')
    tempFile.write('\n'.join(nameList))  # writes "" for an empty player list
    tempFile.close()
    createImage(nameList)
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/153728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档