Seite 1 von 1

Discord.py mit Qt verknüpfen

Verfasst: Samstag 20. April 2019, 15:17
von Phobit
Hallo,
ich versuche einen DiscordBot zu erstellen, der gewisse Signale (Aktivität anderer Bots etc) in einem Qt Gui einbringen soll.
Nur kriege ich es nicht hin, das Discord Modul (discord.py) mit PyQt5 zu kombinieren. Laut Internet soll mir bei sowas wohl das Modul "threading" helfen, aber das bringt mir recht wenig, weil

1. Wenn der Bot im Vordergrund ist, heißt es

Code: Alles auswählen

WARNING: QApplication was not created in the main() thread.
und das Fenster ist einfach schwarz und lässt nicht mit sich interagieren und

2. wenn Qt im Vordergrund steht, heißt es

Code: Alles auswählen

RuntimeError: set_wakeup_fd only works in main thread
Die class für Qt sieht folgendermaßen aus:

Code: Alles auswählen

class TestGui(QMainWindow):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.pingbtn = QPushButton("ping", self)
        self.pingbtn.move(30, 30)
        self.pingbtn.clicked.connect(self.pingBot)

        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle("TestGUI")
        self.show()

    def pingBot(self):
        # Hier soll der Bot einen anderen Bot anpingen
        pass


def start():
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        ex = TestGui()
        sys.exit(app.exec_())
Der Bot sieht so aus:

Code: Alles auswählen

class TestBot:

    def __init__(self):
        super().__init__()

        self.bot = discord.Client()

        self.SpamKanal = self.bot.get_channel("MyChannelID")

        @self.bot.event
        async def on_ready():
            print("ready...")
            SpamKanal = self.bot.get_channel("myChannelID")
            await SpamKanal.send("Bot aktiv!")

        @self.bot.event
        async def on_message(message):
            if message.author.name == "Bot":
                return

    async def pingOtherBot(self):  # Hier soll der Bot dann den anderen Bot anpingen, das wird später noch mit genauerem befehl gehen...
        await self.SpamKanal.send("Test")


def Main():
    asyncio.set_event_loop(asyncio.new_event_loop())
    TestBot().bot.run("MyToken")
Die Threads rufe ich auf entweder mit

Code: Alles auswählen

thread = Thread(target=start, daemon=True)
thread.start()
oder für den Bot mit:

Code: Alles auswählen

BotThread = Thread(target=Main, daemon=True)
BotThread.start()

Re: Discord.py mit Qt verknüpfen

Verfasst: Samstag 20. April 2019, 16:26
von __blackjack__
@Phobit: Beide brauchen den Hauptthread, also muss man die Ereignisschleifen von beiden verbandeln. Suche auf die Schnelle ergibt die Module `quamash` oder `asyncqt`.

Re: Discord.py mit Qt verknüpfen

Verfasst: Samstag 20. April 2019, 17:54
von Phobit
Danke, die werd ich mir anschauen!