【问题标题】:Discord.py breaking out of a loop with a given custom command. Python 3.9.2Discord.py 使用给定的自定义命令打破循环。蟒蛇 3.9.2
【发布时间】:2021-07-21 21:40:59
【问题描述】:
@client.command(name="start")
async def start(maid_cafe):
    x = len(images)
    if x == 0:
        await maid_cafe.send("0 images cached,\nTry !cache first.")
        return

    loop_run = 1;
    while loop_run < 60:
        if not halt:
            image = random.choice(images)
            await asyncio.sleep(10)
            maid_cafe = client.get_channel(773213667801169930)
            await maid_cafe.send(file=discord.File(f"{image}"))
        else:
            break

在这里需要一些帮助,有点在 python 上的循环中苦苦挣扎。

这里的问题描述如下。我已在代码顶部将停止定义为全局

# Misc.
global halt
global images
images = []
halt = True

我有另一个函数,如果我触发整个循环中断,它就在我在这里首先列出的函数的正下方

@client.command(name="halt")
async def halt(ctx):
    halt = True
    await ctx.send("Send loop coming to a stop.")

现在,当我为要执行的函数执行某个短语时,它不会在我的不和谐通道上显示任何内容,也不会在运行窗口上打印出任何错误。但是当我删除

if not halt:
            ...
            ...
            ...
            ...
        else:
            break

机器人完美地在频道上显示消息,没有任何问题,但代价是我无法停止循环并且它会继续持续......

基本上我在这里想要实现的是是否可以创建一个单独的函数来打破循环。

任何帮助将不胜感激!

【问题讨论】:

    标签: python discord discord.py


    【解决方案1】:

    这不是关键字 global 在 Python 中的工作方式! 在 Python 中,它的意思是“不要在本地范围内查找此变量,而是在全局范围内查找”,这意味着您有使用函数的全局关键字inside。 (您的代码当前所做的是创建一个名为 halt 的新局部变量,它不与全局 halt 交互。

    试着让你的代码看起来像这样:

    halt = False
    
    
    @client.command(name="start")
    async def start(maid_cafe):
        global halt  # !!!!!!!!! IMPORTANT !!!!!!!!!
        halt = False
    
        loop_run = 1
        while loop_run < 60:
            if not halt:  # no "global" needed for reads, only for write
                ...
    
    
    @client.command(name="halt")
    async def halt(ctx):
        global halt  # !!!!!!!!! IMPORTANT !!!!!!!!!
        halt = True
    
        await ctx.send("Send loop coming to a stop.")
    

    【讨论】:

    • 刚刚查看了我的代码并纠正了错误,但似乎没有运气,但我已经删除了顶部以前的 global halt 并在函数内部替换它,提到了 halt=True在 start 函数的顶部并编辑了 start 函数中的所有内容,但仍然不明白是什么阻止它运行......
    • 我修复了停止机制。要让它开始运行,只需将halt = False 放在顶层(我的错)
    • halt = False 也不走运,我是否应该提交完整的代码,看看它是否可能与某些东西冲突?我非常怀疑它在外部是否存在冲突,因为当我删除 if not halt: 语句和 else: break 时它工作得非常好
    • @AzurBarnitzke 确定,提交
    • 哦,发现当我在 'return' 和 'loop_run = 1' 之间包含 'halt = False' 时,机器人终于开始推出图像,我收到所需的输出问题是当我执行 '!halt!'我之前更正过它似乎对机器人没有任何影响......?我会提交代码,请稍等一下。
    【解决方案2】:

    您的问题的基础是halt 在启动时设置为True

    我还发现了一些关于您的代码的其他内容:

    • 停止功能/命令什么都不做。我假设您希望将 halt 设置为 True,然后再设置为 False

    • 如果机器人在多个地方运行,使用此方法,停止命令将结束所有这些。不知道是不是你想要的。

    • 如果你改变这个,你的代码会更易读

    while loop_run < 60:
        if not halt:
            ...
        else:
           break
    

    有了这个:

    while loop_run < 60 and not halt:
        ...
    
    • loop_run 永远不会增加。

    【讨论】:

    • 我已将其更改为 while loop_run &lt; 60 and not halt: 已删除 else: break 尝试在代码顶部设置 halt = True 然后稍后 halt = False 仅用于检查但仍然没有来自机器人的输出。另外,是的,我已经承认,如果我在多个地方使用该机器人,则一次调用可以使整个机器人崩溃,但到目前为止,我还没有这样做的计划。谢谢你提醒我。如果您能弄清楚可能仍然存在的问题,那就太好了...
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2020-08-04
    • 2021-02-22
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多