Reputation: 317
So my problem is that the tkinter window doesn't appear when I'm using the discord.py API. But when I do ctrl+c to exit out the tkinter window it automatically appears, I think there's a conflict with client.run(TOKEN) because when I take that line out it works, but then my application doesn't do anything.
from tkinter import *
from discord.ext.commands import Bot
from discord import Game
TOKEN = ""
BOT_PREFIX = "!"
client = Bot(command_prefix=BOT_PREFIX)
root = Tk()
root.title("NinjaBoT Discord Client")
root.resizable(0, 0)
root.configure(bg="black")
root.geometry("630x520")
labelframe2 = LabelFrame(root)
labelframe2.config(bg="black", padx=5, pady=10)
labelframe2.grid(row=1, column=3)
labelframe3 = LabelFrame(root)
labelframe3.config(bg="black", padx=5, pady=10)
labelframe3.grid(row=1, column=0)
labelframe = LabelFrame(labelframe3)
labelframe.config(bg="black", padx=5, pady=10)
labelframe.grid(row=2, column=0)
label = Label(root, text="NinjaBoT Discord")
label.config(bg="black", fg="white")
label.config(font=("Courier", 30))
label.grid(row=0)
label1 = Label(labelframe2, text="::USERS::")
label1.config(bg="black", fg="white")
label1.grid(row=0, column=0)
txtscroll = Text(labelframe3)
txtuserlist = Text(labelframe2)
txtmessage = Text(labelframe)
@client.event
async def on_message(message):
txtscroll.insert(END, "#" + str(message.channel) + ":" + " " + str(message.author) + ":" + " " + message.content + "\n")
x = message.server.members
for users in x:
txtuserlist.insert(END, str(users.name) + "\n")
@client.event
async def on_ready():
await client.change_presence(game=Game(name="GUI"))
txtscroll.insert(END, 'Logged in as' + "\n")
txtscroll.insert(END, client.user.name + "\n")
txtscroll.insert(END, client.user.id + "\n")
txtscroll.insert(END, '-----------------------' + "\n")
scrollbar = Scrollbar(labelframe3)
scrollbar.grid(row=1, column=1, sticky="ns")
txtscroll.config(width=60, height=20, bg="black", fg="white")
txtscroll.grid(row=1, pady=10, sticky=W)
scrollbar.config(bg="black", command=txtscroll.yview)
txtscroll.config(yscrollcommand=scrollbar.set)
txtmessage.config(width=49, height=1)
txtmessage.grid(row=2, column=0, sticky=W)
b = Button(labelframe, text="SEND",fg="white", command="send")
b.grid(row=2, column=1, padx=5)
txtuserlist.config(width=10, height=23)
txtuserlist.grid(row=1, column=0, padx=5, pady=5)
client.run(TOKEN)
root.mainloop()
is there a better way to use client.run(TOKEN) so that this would work? I think is conflicting with root.mainloop()
Upvotes: 3
Views: 2559
Reputation: 61
This worked for me: just run bot in another thread: here is an example
import threading
import discord
from tkinter import *
client = discord.Client()
@client.event
async def on_ready():
print(f'{client.user} has connected to Discord!')
def run():
bot.run("bot token")
def an():
t = threading.Thread(target=run)
t.start()#run the "run" function on another thread
root = Tk()
root.geometry('100x100')
# Create a Button
btn = Button(root, text = 'Run', bd = '5',
command = an)
btn.pack(side = 'top')
root.mainloop()
Upvotes: 1
Reputation: 811
I'm not that familiar with Tkinter, but when you run the line client.run(TOKEN)
, it blocks the code until the bot stops working, essentially not reaching the next line.
You probably want to run root.mainloop()
asyncly before you run the bot.
You can do that by putting that line in an async function:
async def open_window():
root.mainloop()
And then adding it to the event loop:
client.loop.create_task(open_window())
client.run(TOKEN)
Upvotes: 2