Tkinter не хочет работать при использовании discord.py - PullRequest
0 голосов
/ 20 октября 2018

Так что моя проблема в том, что окно tkinter не появляется, когда я использую API-интерфейс discord.py.Но когда я нажимаю ctrl + c для выхода из окна tkinter, оно появляется автоматически, я думаю, что возникает конфликт с client.run (TOKEN), потому что когда я беру эту строку, она работает, но тогда мое приложение ничего не делает.

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()

Есть ли лучший способ использовать client.run (TOKEN), чтобы это работало?Я думаю, что конфликтует с root.mainloop ()

1 Ответ

0 голосов
/ 21 октября 2018

Я не слишком знаком с Tkinter, но когда вы запускаете строку client.run(TOKEN), она блокирует код до тех пор, пока бот не перестанет работать, по существу не достигнув следующей строки.

Возможно, вы захотите запуститьroot.mainloop() асинхронно перед запуском бота.Вы можете сделать это, поместив эту строку в асинхронную функцию:

async def open_window():
    root.mainloop()

, а затем добавив ее в цикл обработки событий:

client.loop.create_task(open_window())
client.run(TOKEN)
...