Seite 1 von 1

Discord kurzfristig unterbrechen

Verfasst: Montag 9. Juli 2018, 18:15
von Phobit
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]

Re: Discord kurzfristig unterbrechen

Verfasst: Montag 9. Juli 2018, 18:35
von __blackjack__
@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))

Re: Discord kurzfristig unterbrechen

Verfasst: Mittwoch 11. Juli 2018, 15:12
von Phobit
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)