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

Du hast eine Idee für ein Projekt?
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

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.
Zuletzt geändert von Pythonprog am Dienstag 24. Januar 2006, 17:04, insgesamt 6-mal geändert.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
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.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@ Leonidas
wo hast du den direkten Link zum Post her?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Dank dir Leonidas, ist mir echt noch nie aufgefallen :shock: .
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Setzt doch erstmal die um, die schon genannt wurden... Dann können wir weiter sehen :lol:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

Ich habe den Code oben jetzt entsprechen nach tk. abgeändert, ich hoffe, dass ich noch mehr Vorschläge bekomme.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

UUUPS, das hab ich ganz übersehen, ich werde mich gleich mal ransetzen, Entschuldigung
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

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 )
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

gerold hat geschrieben:Hier noch ein Beispiel dazu.
Da siehst du auch, wo die Docstrings hingehören.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

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
Antworten