【问题标题】:How to make data to be shown in tabular form in discord.py?如何使数据在 discord.py 中以表格形式显示?
【发布时间】:2020-12-13 09:01:55
【问题描述】:

您好,我正在创建一个制作积分表/排行榜的机器人,下面的代码非常好用。

def check(ctx):
    return lambda m: m.author == ctx.author and m.channel == ctx.channel


async def get_input_of_type(func, ctx):
    while True:
        try:
            msg = await bot.wait_for('message', check=check(ctx))
            return func(msg.content)
        except ValueError:
            continue

@bot.command()
async def start(ctx):
    await ctx.send("How many total teams are there?")
    t = await get_input_of_type(int, ctx)
    embed = discord.Embed(title=f"__**{ctx.guild.name} Results:**__", color=0x03f8fc,timestamp= ctx.message.created_at)
    
    lst = []
    
    for i in range(t):
        await ctx.send(f"Enter team {i+1} name :")
        teamname = await get_input_of_type(str, ctx)
        await ctx.send("How many kills did they get?")
        firstnum = await get_input_of_type(int, ctx)
        await ctx.send("How much Position points did they score?")
        secondnum = await get_input_of_type(int, ctx)
        lst.append((teamname, firstnum, secondnum))  # append 
        
    lstSorted = sorted(lst, key = lambda x: int(x[1]) + int(x[2],),reverse=True) # sort   
    for teamname, firstnum, secondnum in lstSorted:  # process embed
        embed.add_field(name=f'**{teamname}**', value=f'Kills: {firstnum}\nPosition Pt: {secondnum}\nTotal Pt: {firstnum+secondnum}',inline=True)

    await ctx.send(embed=embed)  

结果如下所示:

但我想知道,我可以做些什么来获得表格形式的结果,比如团队名称、位置点、总分、连续写的击杀分以及打印在它们下面的结果(我真的不知道,如果这让你明白我想说什么。)

下图帮助你理解,

所以我希望结果采用以下格式。我想不出办法,如果你能回答这个问题,请这样做,那将是一个非常大的帮助! 谢谢。

【问题讨论】:

标签: python discord discord.py


【解决方案1】:

这可能是最接近的:

embed.add_field(name=f'**{teamname}**', value=f'> Kills: {firstnum}\n> Position Pt: {secondnum}\n> Total Pt: {firstnum+secondnum}',inline=False)

代码将输出如下内容:

我已将inline 设置为False 并将> 字符添加到每个统计信息中。

【讨论】:

    【解决方案2】:

    好的,有一种方法可以做到这一点,但是,您将无法将字段名称用作团队名称!

    @bot.command(name = 'test')
    async def test(context: commands.Context):
        # Example dataset here! 
        DATASET = (
            # Rank, team, kills, positions, totals ... 
            (1, 'A', 2, 4, 6),
            (2, 'B', 3, 3, 6),
            (3, 'C', 4, 2, 6)
        ) # Assumes we have sorted this! 
        s = ['Rank     Team   Kills   PosPts.  Total']
        # This needs to be adjusted based on expected range of values or   calculated dynamically
        for data in DATASET:
            s.append('   '.join([str(item).center(5, ' ') for item in data]))
            # Joining up scores into a line
        d = '```'+'\n'.join(s) + '```'
        # Joining all lines togethor! 
        embed = discord.Embed(title = 'Quotient Results', description = d)
        await context.send(embed = embed)
    

    应该会按预期进行。

    【讨论】:

      【解决方案3】:

      使用table2ascii,您可以轻松生成 ascii 表并将它们放入 Discord 上的代码块中。

      您也可以选择在嵌入中使用它。

      from table2ascii import table2ascii as t2a, PresetStyle
      
      # In your command:
      output = t2a(
          header=["Rank", "Team", "Kills", "Position Pts", "Total"],
          body=[[1, 'Team A', 2, 4, 6], [2, 'Team B', 3, 3, 6], [3, 'Team C', 4, 2, 6]],
          style=PresetStyle.thin_compact
      )
      
      await ctx.send(f"```\n{output}\n```")
      

      您可以从许多替代样式中进行选择。

      from table2ascii import table2ascii as t2a, PresetStyle
      
      # In your command:
      output = t2a(
          header=["Rank", "Team", "Kills", "Position Pts", "Total"],
          body=[[1, 'Team A', 2, 4, 6], [2, 'Team B', 3, 3, 6], [3, 'Team C', 4, 2, 6]],
          first_col_heading=True
      )
      
      await ctx.send(f"```\n{output}\n```")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 2013-06-23
        • 2010-10-30
        相关资源
        最近更新 更多