0

Recently I have been into making of a bot and have done a lot but just a while ago I got into this error which is not really getting fixed by me. So I thought I could ask you for some help.

Context:

For the current situation my bot is to send a custom message which I send my self. For this I have created a tkinter window in which I have a Text widget and a Button. I enter the message I want to send inside the Text widget and then I click on the Button to send the message. The bot has to send that message as if it is sending it.

Error:

The script works just fine but whenever I click the button to send the text. It shows me the error mentioned below:

C:\Users\Bhavyadeep\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py:1421: RuntimeWarning: coroutine 'custom_message.<locals>.cm_send' was never awaited
  self.tk.mainloop(n)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback

I tried several things myself but none seemed to work.

Code:

Here is the code which relates to this issue:

@NucleoTech.command()
async def custom_message(ctx):
    if ctx.author.id == myid:
        confirm_embed = discord.Embed(title='Custom Message Window Opened!', description='Hey Bhavyadeep! I have opened the custom message window now. You can see it is visible to you now.', color=0x4fff4d)
        confirm_embed.set_footer(text=ctx.author)
        await ctx.channel.send(embed=confirm_embed)
        cm_window = Tk()

        cm_window.geometry('300x300')
        cm_window.resizable(False, False)

        cm_text = Text(cm_window, height=15, width=36)
        cm_text.place(x=2.75, y=1)

        async def cm_send():
            text = cm_text.get(1.0, 'end')
            sendcm_embed = discord.Embed(title='Custom Message!', desciption=f'{text}')
            sendcm_embed.set_author(name='NucleoBot')
            sendcm_embed.set_footer(text=ctx.author)
            await ctx.channel.send(embed=sendcm_embed)
            await asyncio.sleep(2)
            text.delete(1.0, 'end')

        cm_send_button = Button(cm_window, text='Send', command=cm_send, width=20, height=2)
        cm_send_button.place(x=2, y=250)

        cm_window.mainloop()

    if ctx.author.id != myid:
        errorperm_embed = discord.Embed(title='Access Denied!', description='This command is `OWNER` only. You are not allowed to use this. Try not to execute it another time.', color=0xFF0000)
        errorperm_embed.set_footer(text=ctx.author)
        await ctx.channel.send(embed=errorperm_embed)

If you still need the whole code you can ask me for it anytime. I would send it. :)

Thank You! :)

Bhavyadeep Yadav
  • 819
  • 8
  • 25
  • I would look at threading. Keep tkinter in the main thread (because it is not thread safe) and run the bot in another. – Henry Mar 24 '21 at 17:37
  • @Henry I appreciate your help but I didn't get what you meant. You want me to run this window in another file then import it in the main file with Bot's run code? – Bhavyadeep Yadav Mar 25 '21 at 06:19
  • 1
    [Something like this](https://stackoverflow.com/questions/16745507/tkinter-how-to-use-threads-to-preventing-main-event-loop-from-freezing) may help – Henry Mar 25 '21 at 18:37

2 Answers2

2

This is more of Tkinter's problem. As @henry said it's not thread safe, that is, it runs Tkinter in a different processor core than your bot, and when the Bot tries to access the Text from the Text Widget, it is not able to get it.

INdIE DeV
  • 36
  • 3
0

You could try to change:

text.delete(1.0, 'end')

Into:

await text.delete(1.0, 'end')
dharmey
  • 85
  • 2
  • 8