Discord kurzfristig unterbrechen

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 hätte eine Frage zu Discord-Py.
Ich habe über Discord Py einen Python Bot laufen. Mein Plan ist es, während der Bot läuft etwas -im Namen des Bottes- schreiben zu können. Mein Plan war, (ich weiß, er ist...seltsam... :K ) das ganze mit Tkinter zu verknüpfen.
Und zwar soll folgendes passieren:
Wenn der Bot fertig hochgefahren und verbunden ist, soll er (im on_ready event) ein Tkinter Fenster öffnen, mit einem Button, "Unterbrechen". Wenn der Button gedrückt wird, soll sich ein neues Tkinter Fenster öffnen, das Main Porgramm des Bottes wird derweil pausiert. In diesem neuen Fenster kann ich in ein Eingabefeld meinen Text schreiben und über einen "GET_Button" das ganze auslesen und dann auch posten. dann sollen sich dieses Fenster wieder zerstören und das Programm soll wieder ganz normal weiterlaufen.
Nur, der Bot fährt hoch, aber sämtliche Tkinter Anweisungen werden einfach ignoriert. Hier der bisherige "on_ready" Codeausschnitt:

Code: Alles auswählen

@client.event
async def on_ready():
    konsole = Tk()
    konsole.title("Discord Bot")
    def KonsolenEingabe():
        konsole2 = Tk()
        eingabefeld = Entry(konsole2, bd=5, width=40)
        eingabefeld.pack()
        def EingabeGet():
            EntryGet = eingabefeld.get()
            GET_Button = Button(konsole2, command=EingabeGet)
            GET_Button.pack()
            client.send_message(channel1, EntryGet)
    Unterbrechen_Button = Button(konsole, text="Schreiben", command=KonsolenEingabe)
    Unterbrechen_Button.pack()
    print("Bot hochgefahren, aktiv auf Servern:\n")
    [(lambda s: print(" - %s (%s)" % (s.name, s.id)))(s) for s in client.servers]
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Phobit: Das wird so nicht gehen. Zum ersten darf es nur ein `Tk`-Objekt zur gleichen Zeit geben. Das ist *das* Hauptfenster. Für zusätzliche Fenster gibt es `Toplevel`. Und dann muss für die GUI die Tk-Hauptschleife aufgerufen werden, also die `mainloop()`-Methode. Und die blockiert, das heisst die kehrt erst zurück wenn das Fenster geschlossen wurde. Da GUIs normalerweise im Hauptthread laufen wollen, müsstest Du den Bot in einen eigenen Thread verschieben. Und dann beispielsweise über eine oder mehrere `queue.Queue`-Objekte zwischen den beiden Threads kommunizieren. Und/oder mit den entsprechenden Mitteln aus dem `threading`-Modul arbeiten.

Die letzte Zeile ist übrigens sehr unsinnig. Der ``lambda``-Ausdruck macht keinen Sinn genau so wenig wie die Schleife in eine „list comprehension“ zu stecken wenn die erzeugte Liste aus lauter `None`-Werten für nichts verwendet wird. Das sollte so aussehen:

Code: Alles auswählen

    for server in client.servers:
        print(' - {0.name} ({0.id})'.format(server))
„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

Ok, gäbe es vllt eine andere Möglichkeit, im Namen des Bottes eine Nachricht zu verschicken?
Ich dachte halt über den Gui würds am einfachsten gehen...(Liegt halt auch an meinen sehr primitiven Python Kenntnissen)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten