Seite 1 von 2

Kleiner Chatbot, ich schätze es gibt viel zu vereinfachen

Verfasst: Donnerstag 19. Januar 2006, 19:17
von Pythonprog
Hallo,
ich habe einen Chatbot geschrieben(nicht zu hohe Anforderungen stelle, ich bin eher Python Anfänger) Ich wollte mal Fragen, ob es was zu vereinfachen und besser machen gibt, dass euch Profis vielleicht Kopfschmerzen bereitet wenn ihr es seht!

Code: Alles auswählen

import sys
import time
import string
import Tkinter as tk


def Beenden():
    """
    Dies ist die Funktion 
    zum Beenden des Programm
    """ 
    datei.write("Beenden")
        sys.exit(0)

""" Funktion zum Zeichen in String finden """
def neu(Bed, Ant):
    """
    Dies ist die Funktion, 
    die die Bedingung
    prüfen soll
    """
    Frage = eingabe.get()
    index = string.find(Frage, Bed)
    if index > 0:
        textfenster.insert(tk.END, Ant)


def Abschicken():
    """
    Dies ist die Funktion,
    die aufgerufen wird,
    wenn der User mit OK
    bestätigt
    """

    Frage = eingabe.get()
    neu("Hallo", "Morgen")
    neu("Moin", "Hallo")

def main():
    """
    Hauptfunktion
    """
    global eingabe, textfenster
    datei = open("LOG.txt", "a")
    Time = time.asctime()
    root = tk.Tk()
    root.title("Chatbot Version 1.2")
    eingabe = tk.Entry(root, background="yellow")
    eingabe.pack()
    textfenster = tk.Text(root, foreground="blue", font = "arial")
    textfenster.pack()
    OK = tk.Button(root, text = "OK", command = Abschicken)
    OK.pack(side= 'bottom')
    bende = tk.Button(root, text = "Beenden", command = Beenden)
    bende.pack(side= 'bottom')
    root.mainloop()
if __name__ == '__main__': 
    main()

Die Zeit und die Datei Namens LOG werden eigentlich gebraucht aber ich habe sie hier vornevor gelasssen, da sie für das eigentlich eProgramm nicht wichtig sind.

Falls irgendjemand Lust hat es sich anzuschauen, es wäre nett mir verbesserungsvorschläge zu posten.

Edit (Leonidas): Python als Highlighting eingestellt.

Verfasst: Donnerstag 19. Januar 2006, 20:02
von Mr_Snede
Allgemein sollte man von:

Code: Alles auswählen

from Tkinter import *
Abstand nehmen und besser:

Code: Alles auswählen

import Tkinter as tk
benutzen.

Eine kleine Diskussion dazu gab es unter:
http://www.python-forum.de/viewtopic.ph ... c&start=30
(recht weit unten, ab BlackJacks Post vom Do Feb 17, 2005 00:57)


Und die Kommentare zu den Funktionen kommen in die Funktion als Docstring.
http://www.python-forum.de/viewtopic.ph ... ight=pydoc

cu Sebastian

Verfasst: Donnerstag 19. Januar 2006, 20:13
von Leonidas
Mr_Snede hat geschrieben:Eine kleine Diskussion dazu gab es unter:
http://www.python-forum.de/viewtopic.ph ... c&start=30
(recht weit unten, ab BlackJacks Post vom Do Feb 17, 2005 00:57)
Also der hier

Ich finde das Programm etwas unübersichtlich, eine main() funktion wäre da sehr nett.. mehr kann ich im Moment nicht sagen, da ich wenig Zeit habe.

Verfasst: Donnerstag 19. Januar 2006, 20:18
von Gast
Danke für die ANtworten bis hierher!
Ich möchte noch eines Anmerken:
Es gibt eine Funktion Countdown, die anscheinend nicht gebraucht wird, dies ist nicht so. In der Version mit der Vollständigen Datenbank kann man den Bot nach einem Countdown Fragen und er führt ihn aus.

Verfasst: Donnerstag 19. Januar 2006, 20:19
von Mr_Snede
@ Leonidas
wo hast du den direkten Link zum Post her?

Verfasst: Donnerstag 19. Januar 2006, 20:55
von Leonidas
Mr_Snede hat geschrieben:wo hast du den direkten Link zum Post her?
Neben dem "Verfasst am:"-Text im Header der Posts ist ein kleines Symbol einer Seite (meist weiß, bei ungelesenen Beiträgen orange) und dieses Icon verlinkt direkt auf den Post.

Verfasst: Freitag 20. Januar 2006, 01:16
von Mr_Snede
Dank dir Leonidas, ist mir echt noch nie aufgefallen :shock: .

Verfasst: Freitag 20. Januar 2006, 20:54
von Pythonprog
Hallo,
ich möchte auf keinen Fall unhölich klingen aber wäre es vielleicht möglich mir Verbesserungsvorschläge für den Chatbot zu geben?
Danke mal im Voraus

Verfasst: Freitag 20. Januar 2006, 21:21
von jens
Setzt doch erstmal die um, die schon genannt wurden... Dann können wir weiter sehen :lol:

Verfasst: Freitag 20. Januar 2006, 23:33
von Pythonprog
Das mit den Kommentaren hab ich geändert aber vielleicht ist es dumm von mir oder ich habe etwas übersehen.

Wenn ich folgendes mache:

Code: Alles auswählen

import Tkinter as tk
Dann kriege ich Fehlermeldungen mit Name not Defined.
Wo muss ich den Syntax ändern?

Verfasst: Freitag 20. Januar 2006, 23:46
von Leonidas
Du must in allen Namen die aus den Namespace Tkinter importiert worden sind ein tk. einfügen: so wird as Tk() ein tk.Tk() und aus Entry() ein tk.Entry() usw.

Verfasst: Samstag 21. Januar 2006, 01:15
von Pythonprog
Ich habe den Code oben jetzt entsprechen nach tk. abgeändert, ich hoffe, dass ich noch mehr Vorschläge bekomme.

Verfasst: Samstag 21. Januar 2006, 21:20
von Leonidas
Du hast das noch nicht angewendet:
Mr_Snede hat geschrieben:Und die Kommentare zu den Funktionen kommen in die Funktion als Docstring.
http://www.python-forum.de/viewtopic.ph ... ight=pydoc
Meinen Tipp eine main()-Funktion zu machen hat dich scheinbar auch kalt gelassen ;)

Verfasst: Sonntag 22. Januar 2006, 00:16
von Gast
UUUPS, das hab ich ganz übersehen, ich werde mich gleich mal ransetzen, Entschuldigung

Verfasst: Sonntag 22. Januar 2006, 00:39
von Pythonprog
Ich habe jetzt die Änderunge, so gut wie es im Moment ging durchgeführt, ich hoffe, ich habe das mit der Main Funktion so richtig gemacht ( Es läuft wenigstens )

Verfasst: Sonntag 22. Januar 2006, 00:47
von gerold
Pythonprog hat geschrieben:Ich habe jetzt die Änderunge, so gut wie es im Moment ging durchgeführt, ich hoffe, ich habe das mit der Main Funktion so richtig gemacht ( Es läuft wenigstens )
Hi Pythonprog!

In einem anderen Zusammenhang habe ich in einem Beitrag auch erklärt wie man so eine Hauptfunktion ("main()") einsetzt. Hier noch ein Beispiel dazu.

mfg
Gerold
:-)

Verfasst: Sonntag 22. Januar 2006, 12:15
von Mr_Snede
gerold hat geschrieben:Hier noch ein Beispiel dazu.
Da siehst du auch, wo die Docstrings hingehören.

Verfasst: Sonntag 22. Januar 2006, 17:57
von Gast
So, ich habe wieder ein paar Änderungen vorgenommen und bin prompt auf eine neue Frage gestoßen:

Wie ist es möglich, dass es erkennt, wenn er auf etwas nicht geantwortet hat, daher das er die Antwort nicht kennt. Ich habe es mit einer Zählvariable versucht, dass führte aber aus mit unverständlichen Gründen, zu immer mehr Fehlfunktionen in dem Programm.
Es soll nämlich so sein, dass er dann den Benutzer nach der Antwort für die Frage fragt und diese Antwort zusammen mit der Frage abspeichert, für den Fall, dass ihm die gleiche Frage später nochmal gestellt wird.
Ich hoffe mir kann jemand helfen dies ( wenn auch nur im Ansatz, wenn es zu kompliziert wird ) umzusetzen oder mir einfach nur einen Tipp zu geben.

Verfasst: Sonntag 22. Januar 2006, 20:22
von Leonidas
Die Funktionsnamen solltest du generell klein schreiben (nur Klassennamen werden mit Großbuchstaben begonnen und um die main() funktion zu starten solltest du besser sowas verwenden:

Code: Alles auswählen

if __name__ == '__main__':
    main()

Verfasst: Dienstag 24. Januar 2006, 17:25
von Pythonprog
Danke, ich habe es geändert und noch ne kleine Frage.
Wäre es Sinnvoll, das Programm um ein paar Klassen reicher zu machen, ich hab mir folgendes überlegt in einer externen Datei.

Code: Alles auswählen

import string
class Funktionen:
        def __init___(self, Frage, Bedingung, Antwort):
            self.frage = Frage
            self.bedingung = Bedingung
            self.antwort = Antwort
        def Pruefe(self):
            self.index = string.find(self.frage, self.bedingung)
            if self.index > 0:
                print self.antwort
und dann dem entsprechen

Code: Alles auswählen

import MEINE DATEI.py
Funktion = MEINE DATEI.Funktionen("Hallo", "allo", "Auch hallo")
Funktion.Pruefe()
Bitte um eure Meinung