Как запустить две блокирующие петли вместе - ткинтер и диссон - PullRequest
0 голосов
/ 02 июня 2019

Я бы хотел запустить discord.py, оболочку для API Discord, которая помогает создавать ботов на основе Python.Я хотел бы запустить tkinter, чтобы разрешить некоторый внешний интерфейс для бота (например, кнопки «Пуск» и «Стоп»).

Если я вначале запускаю tkinter, графический интерфейс пользователя блокируется, как только я запускаю бота.Если я сначала запускаю бота, графический интерфейс не запускается.Я не знаю достаточно, чтобы ясно увидеть проблему, но я думаю, что они оба используют блокирующие циклы.Я думаю, что многопоточность и сны - подход, чтобы исправить это.

import discord
import tkinter
bot = discord.Client()
root = tkinter.Tk()

# Methods without arguments to be called from buttons
def start():
    with open('token.txt') as f:
        TOKEN = f.readline()
    bot.run(TOKEN)
def stop():
    bot.close()

# This is how discord.py uses messages
@bot.event
async def on_message(message):
    if message.content == 'ping':
        await message.channel.send('pong')

if __name__ == '__main__':
    # Building a GUI
    canvas = tkinter.Canvas(root, height=300, width=400, bd=5)
    canvas.pack()
    frame = tkinter.Frame(root, bd=5)
    frame.place(relx=0.05, rely=0.05, relwidth=.9, relheight=.9)

    btn_start = tkinter.Button(frame, text="Start", command=start)
    btn_start.place(relx=0.25, rely=.4, relheight=.2, relwidth=0.25)
    btn_stop = tkinter.Button(frame, text="Stop", command=stop)
    btn_stop.place(relx=0.5, rely=.4, relheight=.2, relwidth=0.25)

    # Here's the juicy code bits that we've come for:
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...