Tkinter 不想在使用 discord.py 时工作



所以我的问题是当我使用 discord.py API 时没有出现 tkinter 窗口。但是当我执行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((冲突

我对 Tkinter 不是很熟悉,但是当你运行该行时client.run(TOKEN),它会阻止代码,直到机器人停止工作,基本上没有到达下一行。

你可能希望在运行机器人之前异步运行root.mainloop()。 您可以通过将该行放在异步函数中来做到这一点:

async def open_window():
root.mainloop()

然后将其添加到事件循环中:

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

这对我有用: 只需在另一个线程中运行机器人: 这是一个例子

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

也许root = Tk()应该root = tkinter.Tk()

https://www.tutorialspoint.com/python/python_gui_programming.htm#:~:text=Tkinter%20is%20the%20standard%20GUI,to%20the%20Tk%20GUI%20toolkit.&text=Import%20the%20Tkinter%20module。

试着做:

import tkinter

而不是

from tkinter import *

最新更新