Discord.py mit Qt verknüpfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

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()
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Beide brauchen den Hauptthread, also muss man die Ereignisschleifen von beiden verbandeln. Suche auf die Schnelle ergibt die Module `quamash` oder `asyncqt`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Phobit
User
Beiträge: 185
Registriert: Freitag 4. Mai 2018, 18:13

Danke, die werd ich mir anschauen!
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten