【问题标题】:Tkinter doesn't want to work when using discord.py使用 discord.py 时,Tkinter 不想工作
【发布时间】:2019-03-25 02:35:56
【问题描述】:

所以我的问题是,当我使用 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() 冲突

【问题讨论】:

  • .run().mainloop() 需要在不同的线程或进程中运行。他们都停止了程序,所以下一行永远不会运行,直到,就像你说的那样,tkinter 窗口关闭或不和谐机器人已经注销。 IMO 在同一个文件中包含不和谐和 TKinter 有点奇怪。

标签: python python-3.x tkinter discord discord.py


【解决方案1】:

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

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

async def open_window():
    root.mainloop()

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

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

【讨论】:

  • 感谢您的回复,我尝试了您发布的代码,现在 tkinter 窗口正在显示,但我的应用程序无法运行,它无法连接到服务器。
  • 问题在于root.mainloop 不是异步函数,因此在运行时会阻塞异步事件循环;因此在 tkinter 窗口关闭之前,discord.py 代码(以及尝试在事件循环中运行的任何其他代码)仍然无法运行。
【解决方案2】:
【解决方案3】:

试着去做:

import tkinter

代替

from tkinter import *

【讨论】:

    猜你喜欢
    • 2021-05-08
    • 2018-04-11
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多