Via Buttonklick neue Klasse erstellen und importieren

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
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Hallo Leute! Ich hab glaube ich ein Anfängerproblem, musste das vorher nie machen.

Und zwar: Ich habe eine base_data.py in dieser Datei müssen nur die Zugangsdaten und die Methodennamen geändert werden und das soll geschehen, wenn eine Funktion ausgeführt wird (via Buttonklick) in meiner Hauptdatei (userinterface.py). Die base_data wird dann verändert, d.h. sie bekommt die von mir eingegebenen Zugangsdaten und erstellt eine neue Klasse im root Ordner (new_class.py).

Bis hierhin klappt alles wunderbar.

Jetzt muss ich aber diese new_class.py auch benutzen, d.h. from new_class import alle Methoden. Der import muss aber in der Funktion geschehen, nachdem die Klasse überhaupt erstellt wurde? Gibt aber nen [Errno 11004] getaddrinfo failed, weil der import nicht ganz oben in der Datei geschieht? Wie soll ich da nun vorgehen?

Ist mein Ansatz schon total falsch?

Im Endeffekt muss, nachdem es möglich ist die new_class zu importieren auch automatisch ein neuer Button erscheinen verknüpft mit einer neuen Methode, die ein neues Toplevel() aufruft in der userinterface, der auch die Methoden der new_class benutzt, also doch etwas happig, aber eins nach dem anderen.

Es soll halt Möglich sein dynamisch weitere Wordpress Blogs mit meinem Tool einzutragen.

hier der Code:

Code: Alles auswählen

#######################################
# Erstellt einen neuen Wordpress Blog #
#######################################
def wp_create_blog():
    blog_root = Toplevel()
    blog_root.title("Wordpress Blog hinzufügen")
    blog_root.resizable(0, 0)
    blog_root.geometry('400x400')

    """ Hier werden die Daten eingestellt fuer den neuen Blog """
    def daten_einstellen():
        with open('base_data.py', 'r') as f:
            read_data = f.read()
        read_data = read_data.replace("'http://die_seite.de/xmlrpc.php'", link_austausch_area.get("1.0", END))
        read_data = read_data.replace("'username_zum_einloggen", user_austausch_area.get("1.0", END))
        read_data = read_data.replace("'pw_zum_einloggen'", pw_austausch_area.get("1.0", END))
        # die Methoden sind erstmal noch so, sollen aber nachher hochgezaehlt werden, so dass es imemr unterscheidliche sind
        read_data = read_data.replace("def wordpress_bild", "def wordpress_bild3")
        read_data = read_data.replace("def wordpress_posten", "def wordpress_posten3")
        read_data = read_data.replace("def old_execute", "def new_execute")
        read_data = read_data.replace("def wordpress_entfernen", "def wordpress_entfernen3")
        return read_data

    """ Erstellt die neue Klasse / Blog im Root Verzeichnis """ 
    def daten_speichern():
        opened_data = daten_einstellen()
        with open('new_class.py', 'w') as datei:
            write_data = datei.write(opened_data)
            showinfo("Information", "Der Blog wurde erfolgreich erstellt!")
            # hier darf ich nicht importieren? from new_class import ... 
    
    """ Labels """
    info_link_austausch = Label(blog_root, text="Link zur Seite")
    info_link_austausch.place(x = 10, y = 10)
    
    info_user_austausch = Label(blog_root, text="Benutzername")
    info_user_austausch.place(x = 10, y = 65)
    
    info_pw_austausch = Label(blog_root, text="Passwort")
    info_pw_austausch.place(x = 10, y = 120)

    """ Text Areas """
    link_austausch_area = Text(blog_root, height = 1, width = 47)
    link_austausch_area.place(x = 10, y = 35)
    link_austausch_area.insert("1.0", "'http://deine_seite.de/xmlrpc.php'")
    
    user_austausch_area = Text(blog_root, height = 1, width = 47)
    user_austausch_area.place(x = 10, y = 90)
    user_austausch_area.insert("1.0", "'Benutzername'")
    
    pw_austausch_area = Text(blog_root, height = 1, width = 47)
    pw_austausch_area.place(x = 10, y = 145)
    pw_austausch_area.insert("1.0", "'Passwort'")
    
    """ Buttons """
#    wordpress_daten_einstellen = Button(blog_root, bg = "powder blue", text = "Daten einstellen", command=daten_einstellen)
#    wordpress_daten_einstellen.place(x = 10, y = 365)
    
    wordpress_daten_speichern = Button(blog_root, bg = "Pale Green", text = "Daten einstellen", command=daten_speichern)
    wordpress_daten_speichern.place(x = 295, y = 365)
BlackJack

@Zoja: Hör sofort auf Code zu generieren. Durchnummerierte Methoden‽ Was soll denn *der* Unsinn? Code schreibt man *einmal* und füttert den dann mit unterschiedlichen Daten, also zum Beispiel Zugangsdaten und die gehören dann in Datendateien, am besten in einem Standardformat wie INI oder JSON. Für beides bietet die Standardbibliothek Module (`ConfigParser` und `json`).

Und die GUI solltest Du objektorientiert erstellen und nicht mit Funktionen die lauter lokale Funktionen enthalten.

Edit: Und bitte `place()` durch vernünftige Layoutfunktionen ersetzen damit das nicht nur auf Deinem Rechner mit Deinen Einstellungen richtig und benutzbar dargestellt wird.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

BlackJack hat geschrieben:@Zoja: Hör sofort auf Code zu generieren. Durchnummerierte Methoden‽ Was soll denn *der* Unsinn? Code schreibt man *einmal* und füttert den dann mit unterschiedlichen Daten, also zum Beispiel Zugangsdaten und die gehören dann in Datendateien, am besten in einem Standardformat wie INI oder JSON. Für beides bietet die Standardbibliothek Module (`ConfigParser` und `json`).

Und die GUI solltest Du objektorientiert erstellen und nicht mit Funktionen die lauter lokale Funktionen enthalten.

Edit: Und bitte `place()` durch vernünftige Layoutfunktionen ersetzen damit das nicht nur auf Deinem Rechner mit Deinen Einstellungen richtig und benutzbar dargestellt wird.
Ja macht Sinn, bin halt noch nicht so erfahren!

Ich nehme JSON oder CSV speichere da die Zugangsdaten und rufe die Basedatei immer mit unterschiedlichen Zugangsdaten auf, so dass die GUI ein Toplevel erstellt für gerade den Blog, dessen Zugangsdaten ich benutze, d.h. die Toplevel Funktion in der GUI brauche ich auch nur einmal!!

Ich mach mich dran alles zu kürzen! Vielen Dank

P.S.:

Sollte man die Daten in eine CSV schreiben und dann die Rows auslesen? Oder in JSON als dic, dann halt Blog = {link : [name,pw], ... }
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wie genau du die Daten speichern solltest haengt von den Daten und deinen Vorlieben ab. Wenn das im Grunde zweidimensionale Daten (laesst es sich problemlos als Tabelle schreiben?) sind, bietet sich CSV an, sonst JSON.
BlackJack

Wobei ich bei JSON etwas ”gesprächiger” wäre als {"http://...": ["Peter", "*****"]}. So etwas lässt sich später nur schlecht erweitern ohne das man an den Code ran muss der das auswertet und derjenige der das bearbeiten muss hätte auch mehr davon wenn etwas mehr Metainformation in den Daten stecken würde. Beispielsweise:

Code: Alles auswählen

{
  "blogs": [
    {
      "link": "http://blog.example.com/",
      "username": "Peter",
      "password": "*******"
    }
  ]
}
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Vielen Dank so weit, ich hatte weder mit json noch mit CSV richtig viel gearbeitet, werde mich also wahrscheinlich noch oft melden! H

Habs jetzt in JSON klappt auch soweit alles!
Antworten