Ausgabefenster mit Tkinter

Fragen zu Tkinter.
Antworten
Gerd
User
Beiträge: 5
Registriert: Dienstag 3. Dezember 2002, 14:38

Dienstag 20. Mai 2003, 11:47

Hallo alle zusammen.

Ich hab ein kleines Problem, ich hab ein Programm geschrieben das
Ordner (mit Unterordner) ausliest und die darin enthaltenen Dateien nach
der Endung sortiert und in neue Ordner verschiebt (zbsp alle
verschiedenen Movies in den Ordner Movie).

Jetzt will ich im zweiten Schritt dem Programm mit Tkinter eine
Benutzeroberfläche aufsetzten. Habe da auch schon angefangen mit
einem Start und beenden Button.

Und jetzt will ich ein Ausgabefenster mit intergrieren, das mir anzeigt auf
der einen seite den ordner der ausgelesen wird und auf der anderen seite
die ordner wo die files hingeschoben werden ( so eine art Explorer).

Kann mir da jemand helfen?

Danke für die Aufmerksamkeit
Gerd
Pythonaya
User
Beiträge: 90
Registriert: Sonntag 26. Januar 2003, 11:34
Wohnort: Großbeeren (nahe Berlin)

Dienstag 20. Mai 2003, 12:21

Hi ho!
Kannst du mal deinen Sourcecode ins Netz pusten?!?
Der wäre nämlich ganz interessant für mich, vielleicht kann ich dir dann auch helfen. :wink:

Bis dann und wann,
Flo
Gerd
User
Beiträge: 5
Registriert: Dienstag 3. Dezember 2002, 14:38

Dienstag 20. Mai 2003, 12:44

Hi

Ist ein wenig lang, könnte man sicher noch vieles vereinfachen.

Code: Alles auswählen

import os, sys, string, shutil
from __builtin__ import file
from Tkinter import *
from tkFileDialog import *

count = 0

def lesen(weg, h1, h2, h3, h4, h5, h6, h7):
    # liest den Paht rekursiv aus(count ist stopper fals zu viele Unterordner)
    global count
    count = count + 1
    if count <=1:
        p = os.listdir(weg)
        checklist(p, weg, h1, h2, h3, h4, h5, h6, h7)
        count = count -1
    else:
        print "weiter nicht\n"
        
def checklist(p, weg, h1, h2, h3, h4, h5, h6, h7):
    #überprüft ob datei oder verzeichnis, splittet datei name auf  
    for i in p:
        i = i.strip()
        print i
        
        if os.path.isdir(weg+ "\\" +i):
            print "ist dir"
            lesen(weg+ "\\" +i, h1, h2, h3, h4, h5, h6, h7)        
        else:
            print "ist datei"
            s = string.split(i, '.')
            t = s[-1]
            erkenn(t, i, weg, h1, h2, h3, h4, h5, h6, h7)

def erkenn(t, i, weg, h1, h2, h3, h4, h5, h6, h7):
    #überprüft ob Datei schon im neuen Verzeichnis existiert    
    g = (weg+ "\\" +i)
    u1 = (h1+ "\\" +i)
    u2 = (h2+ "\\" +i)
    u3 = (h3+ "\\" +i)
    u4 = (h4+ "\\" +i)
    u5 = (h5+ "\\" +i)
    u6 = (h6+ "\\" +i)
    u7 = (h7+ "\\" +i) 

    if os.path.exists(u1):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u2):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u3):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u4):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u5):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u6):
        print "File existiert bereits"
        dr = i
        drin(dr)
    elif os.path.exists(u7):
        print "File existiert bereits"
        dr = i
        drin(dr)
    else:
        schieb(g,t,i,weg,u1,u2,u3,u4,u5,u6,u7)
        
def drin(dr): #bricht ab und kehrt zu lesen zurück
    del dr

def schieb(g, t, i, weg, u1, u2, u3, u4, u5, u6, u7):
    #ordnet anhand der endung    
    Bilder=['bmp','gif','GIF','jpeg','JPEG','JPG','jpe','JPE','jpg', 'paint',\
'psp','PSP','giff','cvs']
    Text=['txt','doc','tif', 'tiff', 'pdf','rtf','cad',\
'dcd','fm','ftp','lwd','msw','wks','csv']
    Prog=['py', 'pyc', 'exe','dll','cab','asp','zip','tgz','bat','inf','com','dcr']
    Flash=['fla','swf','jcd','rf','jc', 'sbl','jc!']
    Mov=['asf','mpg','mpeg','avi','divx','mov','mp','mpe','mmm','mmp',\
'mp','mvi','ptv','qtvr','pt','qtm','swf','awa','awm','mswmm','tgp','swi',\
'cmr','dir','dxr','scm','spl','xmz']
    audio=['mp3','MP3','aif','cda','msv','nra','ra','ram','wav','bun','esf','gsd',\
'hit','la','lam','lma','m1a','mus','ra','ram','rm','rmm','rnx']
    html=['htm','html','HTM','HTML','xml','XML','dhtml', 'xhtml']

    if t in Text:
        os.rename(g, u1)        
        print "fertig\n"
    elif t in Prog:
        os.rename(g, u2)
        print "fertig\n"
    elif t in Bilder:
        os.rename(g,  u3)
        print "fertig\n"
    elif t in Flash:
        os.rename(g, u4)
        print "fertig\n"
    elif t in Mov:
        os.rename(g, u5)
        print "fertig\n"
    elif t in html:
        os.rename(g,u6)
        print "fertig\n"
    elif t in audio:
        os.rename(g,u7)
        print "fertig\n"
    else:
        print "Konnte nicht zugeordnet werden"
        
def main(): #weg abfrage
    weg = (r'H:\Python\Probe\naja') 
#raw_input('Path eingabe:')   
    h1 =(r'H:\Python\Probe\ausgabe\Text') 
#raw_input('Speicherort fuer\n Textdateien:')
    if not os.path.isdir(h1):
        os.mkdir(h1 )
    h2 =(r'H:\Python\Probe\ausgabe\Prog') 
#raw_input('Speichertort\n für Programme:')
    if not os.path.isdir(h2):
        os.mkdir(h2 )
    h3 =(r'H:\Python\Probe\ausgabe\bilder') 
#raw_input('Speichertort\n für Bilder:')
    if not os.path.isdir(h3):
        os.mkdir(h3 )
    h4 =(r'H:\Python\Probe\ausgabe\fla')
#raw_input('Speichertort\n für flash:')
    if not os.path.isdir(h4):
        os.mkdir(h4 )
    h5 =(r'H:\Python\Probe\ausgabe\movie') 
#raw_input('Speichertort\n für movies:')
    if not os.path.isdir(h5):
        os.mkdir(h5 )
    h6 =(r'H:\Python\Probe\ausgabe\html') 
#raw_input('Speicherort\n für Internetseiten:')
    if not os.path.isdir(h6):
        os.mkdir(h6 )
    h7 =(r'H:\Python\Probe\ausgabe\audio')
#raw_input('Speicherort\n für audiodateien:')
    if not os.path.isdir(h7):
        os.mkdir(h7 )    
    lesen(weg, h1, h2, h3, h4, h5, h6, h7)

def later(): 
    print 'noch in arbeit'  

def oeffnen():
    answer = askopenfilename()
    print answer #noch in arbeit

def speichern():
    ans = asksaveasfilename()
    print ans #noch in arbeit

#Hauptprogramm

root = Tk()

menu=Menu(root)
root.config(menu=menu)  

filemenu=Menu(menu) 
menu.add_cascade(label='File', menu=filemenu) 
filemenu.add_command(label='Öffnen', command=oeffnen) 
filemenu.add_command(label='Speichern', command=speichern) 
filemenu.add_separator() 
filemenu.add_command(label='Beenden', command=root.destroy)  

helpmenu=Menu(menu) 
menu.add_cascade(label="Hilfe", menu=helpmenu) 
helpmenu.add_command(label='About', command=later)     

toolbar = Frame(root)

Box = toolbar
Box.pack(side=BOTTOM)
# die eigentliche Listbox
fenster = Listbox(Box, width=30, bg = "black", fg = "green", selectmode=SINGLE)
fenster.pack(side=TOP)

b = Button(toolbar,text="start", width=8, command=main)
b.pack(side=LEFT,padx=2,pady=2)

b = Button(toolbar,text="Beenden", width=8, command=root.destroy)
b.pack(side=LEFT,padx=2,pady=2)

toolbar.pack(side=TOP)

mainloop()
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Dienstag 20. Mai 2003, 16:28

Hallo!
Gerd hat geschrieben:Ist ein wenig lang, könnte man sicher noch vieles vereinfachen.
Und das solltest Du auf jeden Fall machen, bevor Du das GUI in Angriff nimmst. Sonst wirst Du noch an einigen Stellen diese if-elif-Kaskaden vorsehen müssen - je mehr Funktionalität die Oberfläche bekommt (z.B. die Änderung der Zielpfade), desto häufiger.

Eine einfache Möglichkeit wäre ein Feld mit den Daten Der Dateitypen:

Code: Alles auswählen

listTypDaten = (
 ['Bilder', 'H:\\Python\\Probe\\ausgabe\\bilder', ('bmp','gif','jpg')],
 ['Audio',  'H:\\Python\\Probe\\ausgabe\\audio',  ('mp3','MP3','cda','msv','nra')]
 # und so weiter  
 )
Deine Funktion schieb() sähe dann nur noch so aus:

Code: Alles auswählen

def schieb(g, t, typDaten):
    for typ in typDaten: 
        if t in typ[2]:
            os.rename(g,typ[1])
            print "fertig" 
            break
    else:
        print "Konnte nicht zugeordnet werden"
Eine andere Möglichkeit wäre, den Dateityp durch eine Klasse zu repräsentieren und dann mit einer Liste von Instanzen dieser Klasse zu arbeiten.

hth, auch wenn ich das Thema verfehlt habe ;-)
Jan
Gerd
User
Beiträge: 5
Registriert: Dienstag 3. Dezember 2002, 14:38

Mittwoch 21. Mai 2003, 11:12

Hi Voges

Danke erst einmal für die Verbesserung.

Hab das auch gleich umgebaut, funktioniert nicht in der weise das er das
Feld zwar überprüft, aber mir immer sagt das er die datei nicht zuordnen kann.

Was mach ich falsch? Hoffe du kannst mir helfen.

Hier mein neuer umgebauter code teil, habe dafür erkenn()
rausgenommen und main() kleiner gemacht.

Code: Alles auswählen

def schieb(weg, t, i, listTypDaten):
    g = (weg+ "\\" +i)
    for typ in listTypDaten:
        if t in typ[2] and not os.path.isdir(typ[1]):
            os.mkdir(typ[1])
            u = (typ[1]+ "\\" +i)
            if os.path.exists(u):
                print "File existiert bereits"
                dr = i
                drin(dr)
            else:
                os.rename(g, typ[1]) 
                print "fertig" 
                break
    else: 
        print "Konnte nicht zugeordnet werden"
Danke für die Aufmerksamkeit
Gerd
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Mittwoch 21. Mai 2003, 12:32

Hallo!

Das and not os.path.isdir(typ[1]) verhindert, dass Bilder verschoben werden, wenn das 'Bilder'-Verzeichnis existiert. D.h. wenn der Ordner anfänglich nicht existiert, ist die if-Bedinung nur für das erste gefundene Bild wahr. Dem mkdir() musst Du also ein eigenes if spendieren.

Die runden Klammern bei g = und u = sind nicht schädlich, aber überflüssig.

Jan

Nachtrag: Das break müsste noch um eine Einrückung nach links.
Gerd
User
Beiträge: 5
Registriert: Dienstag 3. Dezember 2002, 14:38

Mittwoch 21. Mai 2003, 15:04

Hallo Voges

ich bin am ende mit meinen nerven habe das jetzt so gebastelt.

Code: Alles auswählen

def checklist(p, weg):
    listTypDaten = (['Bilder',...
...)

    for i in p:
        i = i.strip()
        print i       
        if os.path.isdir(weg+ "\\" +i):
            print "ist dir"
            lesen(weg+ "\\" +i)        
        else:
            print "ist datei"
            t = i
            schieb(weg, t, i, listTypDaten)

def drin(dr): #bricht ab und kehrt zu lesen zurück
    del dr

def schieb(weg, t, i, listTypDaten):
    g = weg+ '\\' +i
    t = string.split(t,'.')
    t = t[-1]
    for typ in listTypDaten:
        if t in typ[2]:
            u = typ[1]+ '\\' +i
            print u
            if not os.path.isdir(typ[1]):
                os.mkdir(typ[1])
            if not os.path.exists(u):
                os.rename(g, typ[1])
                print fertig
            else:
                dr = i
                drin(dr)
            break
    else: 
        print "Konnte nicht zugeordnet werden"
Und als fehlermeldung bekomme ich

File "H:\Python\Probe\Fileparser\oberfläche\2.1\filepars_2_1.py",
line 50, in schieb
os.rename(g, typ[1])
OSError: [Errno 17] File exists

hoffe du kannst mir weiter helfen

So long
gerd
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Mittwoch 21. Mai 2003, 15:42

Gerd hat geschrieben:ich bin am ende mit meinen nerven
Cool bleiben!

Ich muss sagen, dass ich mit os.rename() noch nie gearbeitet habe.
Also, beim 2. Parameter reicht es nicht, den Pfad anzugeben, sondern es muss auch noch der Dateiname dabei sein. (Vom Begriff 'rename' ist das eigentlich auch naheliegend.)
os.rename(g,u) müsste also bei Dir funktionieren.
Jan

PS: Ich weiß, ich bin altmodisch, aber "Kleinschreiber"-Texte lese (und beantworte) ich nicht so gerne ;-)
Gerd
User
Beiträge: 5
Registriert: Dienstag 3. Dezember 2002, 14:38

Mittwoch 21. Mai 2003, 15:49

Hallo Voges

Jo vielen dank jetzt funktioniert es. :D

So jetzt kann ich mich ja langsam wieder der Benutzeroberfläche
widmen. :?:

Also bis später.
Gerd

PS. Sorry wegen der Kleinschreibung, hab ich in der Aufregung nicht berücksichtigt.
Antworten