Python-Newbie braucht Hilfe für Ausgabe der Vorgänge

Fragen zu Tkinter.
Antworten
daKingchen
User
Beiträge: 8
Registriert: Dienstag 17. Juli 2007, 10:04

Hallo,

mein Programm sieht in etwa so aus...

Bild

Jetzt denkt ihr euch wahrscheinlich, toll - aber was soll das ...
Auf dem Screenshot ist zu erkennen, wo später die Ausgabe erscheinen soll.
Er soll mir dort anzeigen, was ich kopiere, wie und ob mit Fehlern oder nicht.
Den Code möchte ich euch natürlich auch nicht vorenthalten und darum füge ich ihn an:

Code: Alles auswählen

import shutil, os, os.path, ConfigParser, tkMessageBox
from time import *
from distutils.dir_util import *
from Tkinter import *
from tkSimpleDialog import *


ein1 = ''
ziel = ''


#class __beenden_programm__:
def beenden_ja_nein(root):
    from tkMessageBox import askokcancel
    frage = askokcancel('Beenden?', 'Programm beenden?')
    if frage:
        root.quit()
        root.destroy()

def ende():
    command=beenden_ja_nein(root)


class __MainWindow__:
    def __init__ (self):
        self.fenster = Tk()
        self.fenster.columnconfigure(0, weight=1)
        self.fenster.rowconfigure(0, weight=1)
        self.text = Text(self.fenster, width=40, height=40)
        self.text.grid(row=0, column=0, sticky="nesw")
        self.verticalScroller = Scrollbar(self.fenster, orient="vertical")
        self.verticalScroller.grid(row=0, column=1, sticky="ns")
        self.text['yscrollcommand'] = self.verticalScroller.set
        self.verticalScroller['command'] = self.text.yview
        self.bt_sys = Button(self.fenster, text="Zahlen", command=self.zahlen).grid()
        self.fenster.mainloop()

    def zahlen(self):
        for j in range(1,300):
            self.text.insert(INSERT , str(j) + '\n')
            print j


def backup():
    #labok=Label(root, text="Auftrag wurde ausgeführt!")
    #labok.pack()
    global ein1
    global ziel
    datei = os.path.splitext(ein1)
    time = strftime("%Y%m%d_%H%M%S", localtime())
    zpfad = ziel + "/" + time
    timedir = mkpath(zpfad, mode=0777, verbose=0, dry_run=0)
    shutil.copy(ein1, "%s/%s_kopie%s" % (timedir[0], datei[0], datei[1]))
    tkMessageBox.showinfo('Information', 'Ihr Auftrag wurde ausgeführt!')
    utokay=Button(root,text="Okay!", command=backup)

def ziel():
    global ziel
    ziel=askstring('Pfad' ,'Bitte hier eingeben:  ',
    initialvalue='Eingabe hier...')
    tkMessageBox.showinfo('Info', 'Die Eingabe des Zielordners verlief Fehlerfrei!')

def info():
    tkMessageBox.showinfo('Info', 'Informationen zum Programm!')

def nichtda():
    tkMessageBox.showerror(title="Fehler", message="Funktionen stehen noch nicht zur Verfügung")
    
def eingabe():

    global ein1
    ein1=askstring('Dateinamen', 'Bitte hier eingeben:  ',
    initialvalue='Eingabe hier...')

#Erzeugen eines Fensters
root=Tk()
root.title("Datensicherung 1.0")
#Labelbeschriftung im Fenster
lab=Label(root,text=u"Datensicherungen 1.0")

#Textfenster, dass zur Ausgabe dienen soll!
textfenster=Text(root,width=90)

#Buttons, die angezeigt werden
butokay=Button(root,text="Okay!", command=backup)
buteingabe=Button(root,text="Eingabe", command=eingabe)
butziel=Button(root,text="  Ziel  ", command=ziel)
butinfo=Button(root,text="  Info  ", command=info)
butbeenden=Button(root,text="Beeenden", command=ende)
textfenster.pack(fill=BOTH,expand=YES)
butokay.pack(side = TOP,expand=NO)
buteingabe.pack(side = LEFT,expand=NO)
butziel.pack(side = RIGHT,expand=NO)
#butinfo.pack(fill = BOTTOM,expand=NO)
#butbeenden.pack(side = RIGHT,expand=NO)
menubar = Menu(root)


#Menübar

filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="Open Config", command=nichtda)
filemenu.add_command(label="Save Config", command=nichtda)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=ende)
menubar.add_cascade(label="File", menu=filemenu)

# Mehr Menübareinträge
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Cut", command=nichtda)
editmenu.add_command(label="Copy", command=nichtda)
editmenu.add_command(label="Paste", command=nichtda)
menubar.add_cascade(label="Edit", menu=editmenu)

helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="About", command=info)
menubar.add_cascade(label="Help", menu=helpmenu)

# Anzeigen des Menüs
root.config(menu=menubar)


root.mainloop()
Vllt. hat ja einer der Profis hier eine Idee!
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Da hier noch kein Profi geantwortert hat, versuch ich es mal :)
Ich würde so etwas in der Art an deine Funktion backup() hängen:

Code: Alles auswählen

	self.text.insert(END, "%-7s %-10s %-11s %10s %10s" % ("\nDatei:", ein1, "wurde nach", ziel, "gesichert."))
Allerdings bekomme ich das so gerade nicht zum Laufen, da er in der Funktion self.text nicht kennt...!
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Mein Problem ist vielmehr, dass daKingchen keine Frage gestellt hat. Worauf soll ich denn nun antworten? Er sagt nur was er machen will und da werd ich ihn nicht aufhalten...

Viel Erfolg noch! :-)
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
daKingchen
User
Beiträge: 8
Registriert: Dienstag 17. Juli 2007, 10:04

Natürlich - die Frage soll nicht fehlen...
Auf meinem Screenshot ist ein Ausgabefenster, welches dazu dient, dass dort später die Fehlermeldungen usw. gebracht werden. Nur leider klappt das nicht.
Zizibee, deine Aussage hilft mir schon weiter und ist definitiv die bessere Variante zu meiner.
Also, wie bekomme ich alle Fehler- und sonstige Meldungen in dieses Fenster, und wie erzeug ich eine "Datei.log", wo dann nochmal genau das drin steht?
Vllt. wäre ein Save-Button sinnvoll? - Oder doch automatisch?

Danke schonmal im Vorraus für eure Bemühungen!

MfG

daKingchen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann fange ich mal an und gebe einige Tipps:
Der erste wäre, die ganzen Stern-Imports loszuwerden. Du kannst dann ``import Tkinter as tk`` schreiben, was nicht viel länger ist, aber sehr viel übersichtilicher. Es ist erstaunlich, dass Tkinter-Programmierer dauernd an diesen Stern-Importen hängen.

Dann würde ich die Klasse in ``MainWindow`` umbenennen und alle Funktionen die auf die GUI zugreifen müssen, dieser Klasse zuweisen. Alternativ könnte man ``backup()`` eine Instanz von ``MainWindow`` mitgeben.

Weiterhin gehören die ganzen Globals weg, die Funktionen sollten in die Klasse verschoben werden.

Den ganzen Code der da auf Modulebene stellt gehört mindestens in eine Funktion, wenn nicht sogar gleich in eine eigene Klasse.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

daKingchen hat geschrieben:Natürlich - die Frage soll nicht fehlen...
Auf meinem Screenshot ist ein Ausgabefenster, welches dazu dient, dass dort später die Fehlermeldungen usw. gebracht werden. Nur leider klappt das nicht.
Mit Verlaub: was klappt denn nicht? Ich weiß ja nicht wie der Screenshot zustande gekommen ist. Scheitert es schon am Erstellen des Fensters? Bekommst Du dort gar keine Ausgabe zustande? Oder gibt Dein Programm dort nur manches aus, anderes aber nicht? Gibt es Fehlermeldungen? Hast Du schon nach einem Tutorial gesucht und kommst mit einem Beispiel nicht zurecht oder gibt es in der Doku irgendeine Formulierung, die Dir unklar ist?
daKingchen hat geschrieben:Vllt. wäre ein Save-Button sinnvoll? - Oder doch automatisch?
Kommt wohl auch darauf an, was der Zweck Deines Programmes ist, aber wenn Du Dir da nicht sicher bist, würd ich per default alles automatisch in ne Logdatei schreiben und eine Möglichkeit anbieten das optional auch auszuschalten. Ach ich seh's grad im Fenstertitel des Screenshots: Datensicherung. IMHO lieber mitloggen und das Log gleich mitsichern.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
daKingchen
User
Beiträge: 8
Registriert: Dienstag 17. Juli 2007, 10:04

Hallo,

danke erst einmal für die Tipps!
Was das für ein Programm werden soll, dass weiß glaub ich nur mein Ausbilder.
Ich mache eigentlich eine Ausbildung zum Systemintegrator und soll im Rahmen meiner Ausbildung auch kurz in die Entwicklung kommen.
Die Anforderungen für das Programm sehen wie folgt aus:

Es wird ein Backup-Programm erstellt, dass ein komplettes Verzeichnis samt Inhalt und allen Un-terordnern kopieren wird. Der Zielort für die Dateien und der Quellpfad werden aus einer Parame-terdatei ausgelesen. Der Inhalt des zu kopierenden Verzeichnisses soll am Zielort in einem neu erstellten Verzeichnis abgelegt werden. Dazu wird ein neues Verzeichnis automatisch erstellt, dass als Namen das aktuelle Datum und die Uhrzeit trägt. Nach Erstellung des Verzeichnisses werden dort alle Dateien des Quellpfads abgelegt. Der Programmablauf soll dem Anwender später in einer Logdatei angezeigt werden. Diese Logdatei wird während des Programmablaufs erzeugt und im Zielpfad abgelegt. Diese Datei wird dann als „Backup.log“ vorliegen.

Demnach soll das Programm geschrieben werden.
Ich bin aber mit dieser Aufgabe völlig gescheitert, bzw. das, was oben steht, dass ist mein Ansatz, an dem ich nicht weiterkomme.

Darum dachte ich, dass mir hier geholfen werden kann.
Aber ich denke, dass wird langsam zu viel des Guten...
Nunja, dann werde ich mich mal wieder daran begeben, den Code zu erstellen.

MfG

daKingchen
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich sehe in den Anforderungen gar nicht, dass eine Tk-GUI benötigt wird. Eigentlich sehe ich dort gar nichts von einer GUI-Anforderung. Warum machst du das dann?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
daKingchen
User
Beiträge: 8
Registriert: Dienstag 17. Juli 2007, 10:04

Weil es der nächste Schritt ist. Habe es nur noch nicht in mein Pflichtenheft geschrieben.

Mein Ausbilder ist in Urlaub, ansonsten würde ich den Fragen, wie es klappt!
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Ganz ernst und gut gemeinter Tipp: mach einen Schritt nach dem anderen und versuchs erstmal ohne GUI.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
BlackJack

Wenn es der *nächste* Schritt ist, dann mach doch erst einmal den ersten. Selbst wenn er zweite Schritt nicht klappt, hätte Dein Ausbilder sicher lieber ein funktionierendes kleines Backup als eine GUI die weder "backupped" noch funktioniert. ;-)

Modultipps: `time`, `ConfigParser`, `shutils`.
daKingchen
User
Beiträge: 8
Registriert: Dienstag 17. Juli 2007, 10:04

Danke für den Tipp, doch der bringt mich auch nicht weiter... :?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

daKingchen hat geschrieben:Danke für den Tipp, doch der bringt mich auch nicht weiter... :?
Warum nicht? Schmeiß erstmal das ganze GUI-zeug weg und fange wirklich mit dem ersten Schritt an, d.h. einem funktionieredem Backup-Programm. Das ist die Grundlage. Eine GUI kann man nachher auch hinzufügen, aber zu einer GUI ein Programm dazuzuschrieben ist nicht so simpel.

Die anderen haben dir doch schon gute Tipps gegeben, welche Module du dafür brauchen könntest (ich werfe noch ``datetime`` ein), also schau sie dir doch mal an und versuche daraus ein Programm zusammenzusetzen was funktioniert. Es muss ja nicht auf Anhieb gehen, du kannst ja auch gerne die Hilfe des Forums in Anspruch nehmen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten