kein problem mehr mit klassen .. codeupdate

Fragen zu Tkinter.
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

[edit]
was ihr hier seht ist bereits das endprodukt.. funzt!
nochmals danke an alle!
[/edit]
[edit2]
ich hab mal etwas weiter gebastelt also aktualisiere ich mal
probleme gibt es momentan keine :D
[/edit2]


Hallo,

nach längerer abstinenz melde ich mich auch mal wieder..
hab endlcih mal wieder zeit mit python weiter zu basteln..

leider scheitert es irgendwie bereits bei den einfachsten sachen..

ich hab mal versucht klassen zu benutzen

nunja.. das kam bei raus:

Code: Alles auswählen

#---------------------------------------------------------
# imports

import os
import re
import tkFileDialog
import tkMessageBox
import ScrolledText
import shutil
from Tkinter import *

class convertWindow:

#---------------------------------------------------------
# build gui

    def __init__(self):
       
        self.root=Tk()
        
        frame=Frame(self.root)
        frame.pack(expand=YES)
        
        self.root.title('XML converter vol 1.0')

        selectrahmen = Frame(self.root, relief='groove', borderwidth='2')
        selectrahmen.pack(fill='x')

        select1 = Frame(selectrahmen)
        select1.pack(fill='x')
        select2 = Frame(selectrahmen)
        select2.pack(fill='x')

        selectLab = Label(select1, text='Would you like to convert a single file or multiple files?')
        selectLab.pack(side = 'top', anchor='w')

        self.v = IntVar()
        Radiobutton(select2, text='single', variable=self.v, value=1, command=self.sing).pack(side='left')
        Radiobutton(select2, text='multiple', variable=self.v, value=2, command=self.mult).pack(side='left')
        self.v.set('1')
        
        eingaberahmen = Frame(self.root, relief='groove', borderwidth='2')
        eingaberahmen.pack(fill='x')

        suchDatei = Label(eingaberahmen, text = 'File: ')
        suchDatei.grid(row=1,column=1)

        self.datei = Entry(eingaberahmen, width=45)
        self.datei.grid(row=1,column=2)

        self.dat = Button(eingaberahmen, text = 'search', command=self.get_file)
        self.dat.grid(row=1,column=3)

        suchPfad = Label(eingaberahmen, text = 'Directory: ')
        suchPfad.grid(row=2,column=1)

        self.path = Entry(eingaberahmen, width=45, state='disabled')
        self.path.grid(row=2,column=2)

        self.direct = Button(eingaberahmen, text = 'search',state='disabled', command=self.get_dir)
        self.direct.grid(row=2,column=3)

        eingaberahmen2 = Frame(self.root)
        eingaberahmen2.pack()

        self.cancel = Button(eingaberahmen2, text = 'Cancel', command=self.can)
        self.cancel.pack(side='left')
        self.ok = Button(eingaberahmen2, text = 'OK', command=self.init)
        self.ok.pack(side='left')

        ausgaberahmen = Frame(self.root, relief='groove', borderwidth='2')
        ausgaberahmen.pack(fill='x')

        ausgabeLab = Label(ausgaberahmen, text = 'Messagescreen').pack(side = 'top', anchor='w')

        self.ausgabe = ScrolledText.ScrolledText(ausgaberahmen, width=61, height=10, state='disabled', bg='white')
        self.ausgabe.pack()
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# get directory

    def get_dir(self):
        self.path.insert(0,tkFileDialog.askdirectory())

#---------------------------------------------------------
# get filepath

    def get_file(self):
        self.datei.insert(0,tkFileDialog.askopenfilename())

#---------------------------------------------------------
# cancel

    def can(self):
        old1 = self.path['state']
        old2 = self.datei['state']
        self.path['state'] = 'normal'
        self.datei['state'] = 'normal'                 
        self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path['state'] = old1
        self.datei['state'] = old2
        self.v.set('1')
        self.path['state'] = 'disabled'
        self.direct['state'] = 'disabled'
        self.datei['state'] = 'normal'
        self.dat['state'] = 'normal'
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert a single file window behaviour
    
    def sing(self):
        self.path.delete(0,END)
        #self.datei.delete(0,END)
        self.path['state'] = 'disabled'
        self.direct['state'] = 'disabled'
        self.datei['state'] = 'normal'
        self.dat['state'] = 'normal'
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert multiple files window behaviour
   
    def mult(self):
        #self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path['state'] = 'normal'
        self.direct['state'] = 'normal'
        self.datei['state'] = 'disabled'
        self.dat['state'] = 'disabled'
        self.set_out('Please select a directory to make the rogram search for files.\nNote: ALL xml files will be converted!', 'y')

#---------------------------------------------------------
# print messages to messagescreen

    def set_out(self, text, opt):
        text = text + '\n--------------------------------------------------------------------------------------------------------------------------\n'
        self.ausgabe['state'] = 'normal'
        if (opt == 'y'):
            self.ausgabe.delete(1.0,END)
        self.ausgabe.insert(END, str(text))
        self.ausgabe['state'] = 'disabled'
        self.ausgabe.see(END)
        self.ausgabe.update_idletasks()

#---------------------------------------------------------
# start conversion

    def init(self):
        conversion = conv()

#---------------------------------------------------------
# conversion

class conv:

    def __init__(self):

        x = convert.v.get()
        if (x == 1):
            pfad = convert.datei.get()
            if (pfad == ''):
                tkMessageBox.showerror('Error','You must specify a file to convert!')
                return
            if not pfad.endswith('.xml'):
                tkMessageBox.showerror('Error','Invalid file format!\nYou must specify a XML-file!')
                convert.can()
                return
            convert.set_out(pfad, 'n')
            self.convertfile(pfad)
            pfad, filename = os.path.split(pfad)
            self.bak_killer_call(pfad)
            self.restart()
        elif (x == 2):
            pfad = convert.path.get()
            if (pfad == ''):
                tkMessageBox.showerror('Error','You must specify a directory!')
                return
            convert.set_out(pfad, 'n')
            self.multipleFiles(pfad, '.xml')
            self.bak_killer_call(pfad)
            self.restart()

#---------------------------------------------------------
# restart program or quit

    def restart(self):
        eingabe = tkMessageBox.askyesno('More...','Would you like to convert more files?')
        if eingabe:
            convert.can()
            return
        else:
            convert.set_out('phasing down application','n')
            convert.root.destroy()

#---------------------------------------------------------    
# xml_check

    def xml_check(self, text):
        #check for TemiX control structures
        if re.search('\[CDATA\[', text):
            return 1
        #check for ProjektKit Tag
        if re.search('<pkit-', text):
            return 2
        else:
            return 0
        
#---------------------------------------------------------    
# filter_select

    def filter_select(self, text):

        #TemiX Tags included:
        if (self.xml_check(text) == 1):
            tkMessageBox.showinfo('Info','''File was already opened in TemiX. \n '[' and ']' could not be converted!''')

            text = self.f0(text)
            text = self.f1(text)
            text = self.f3(text)
            text = self.f4(text)
            return text

        #ProjektKit export:
        if (self.xml_check(text) == 2):

            text = self.f0(text)
            text = self.f1(text)
            text = self.f2(text)
            text = self.f3(text)
            text = self.f4(text)
            return text

        else:
            return text

#---------------------------------------------------------    
# filter definitions

    def f0(self, text):
        return text.replace('[Q-]','').replace('[PM-]','').replace('[role]','')

    def f1(self, text):
        return text.replace('','>')
    
    def f2(self, text):
        return text.replace('[','').replace(']','')

    def f3(self, text):
        while 1:
            ort = re.search ('<para class="heading.">(.+?)</para>', text)
            if ort == None:
                break
            text = re.sub('<para class="heading.">(.+?)</para>', r'<p><b>\1</b></p>', text)
        return text

    def f4(self, text):
        return text.replace('<para>','<p>').replace('</para>','<p>')

#---------------------------------------------------------
# multiple file search and convert
  
    def multipleFiles(self, path, extension, depth=0):
        for item in os.listdir(path):
            itemWithPath = os.path.join(path, item)
            if item.endswith(extension):
                datei = itemWithPath
                convert.set_out('Starting conversion', 'n')
                in_file = open(datei,'r')
                inhalt = in_file.read()
                in_file.close()
                bak = datei + '_bak'
                try:
                    shutil.copyfile(datei, bak)
                except IOError:
                    convert.set_out('Backup file could not be generated','n')
                new_string = str(inhalt)
                new_string = self.filter_select(new_string)
                try:
                    out_file = open(datei, 'w')    
                except IOError:
                    convert.set_out('File could not be opened!','n')
                out_file.write(new_string)
                out_file.close()
                convert.set_out('File converted and written','n')
            if os.path.isdir(itemWithPath):
                self.multipleFiles(itemWithPath, extension, depth + 1)

#---------------------------------------------------------
# single file convert

    def convertfile(self, datei):
        convert.set_out('Starting conversion','n')
        in_file = open(datei,'r')
        inhalt = in_file.read()
        in_file.close()
        bak = datei + '_bak'
        try:
            shutil.copyfile(datei, bak)
        except IOError:
            convert.set_out('Backup file could not be generated','n')
        new_string = str(inhalt)
        new_string = self.filter_select(new_string)
        try:
            out_file = open(datei, 'w')    
        except IOError:
            convert.set_out('File could not be opened!','n')
        out_file.write(new_string)
        out_file.close()
        convert.set_out('File converted and written','n')

#---------------------------------------------------------
# bak_killer call

    def bak_killer_call(self, pfad):
        convert.set_out('Starting remove engine','n')
        eingabe = tkMessageBox.askyesno('Remove backup?','Would you like to remove the backup [*.xml_bak] files?')
        if not eingabe:
            convert.set_out('To remove backup files, simply run bak_remover.','n')
            return
        else:
            eingabe = tkMessageBox.askyesno('Remove backup?','Really remove ALL backup files?')
            if not eingabe:
                return
            else:
                self.bak_killer(pfad, '.xml_bak')
            
#---------------------------------------------------------
# backup killer                

    def bak_killer(self, path, extension, depth=0):
        for item in os.listdir(path):
            itemWithPath = os.path.join(path, item)
            if item.endswith(extension):
                os.remove (itemWithPath)
            if os.path.isdir(itemWithPath):
                self.bak_killer(itemWithPath, extension, depth + 1)

#---------------------------------------------------------
# start gui

convert = convertWindow()
convert.root.mainloop()


keine ahnung warum.. aber das will nicht

jemand evtl ne idee?
wär super

slide
Zuletzt geändert von powerslide am Donnerstag 27. Januar 2005, 15:11, insgesamt 2-mal geändert.
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ist zwar jetzt nicht direkt eine Tkinter Frage, sondern eine des Naumensraumes. Zudem auch noch recht leicht zu lösen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import os, string, re
import tkFileDialog
import ScrolledText
from Tkinter import *

class convertWindow:
    def __init__(self):
        self.root=Tk()

        frame=Frame(self.root)
        frame.pack(expand=YES)

        self.root.title('XML converter vol 1.0')

        selectrahmen = Frame(self.root, relief="groove", borderwidth="2")
        selectrahmen.pack(fill="x")

        select1 = Frame(selectrahmen)
        select1.pack(fill="x")
        select2 = Frame(selectrahmen)
        select2.pack(fill="x")

        selectLab = Label(select1, text='Would you like to convert a single file or multiple files?')
        selectLab.pack(side = "top", anchor="w")

        v = IntVar()
        Radiobutton(select2, text="single", variable=v, value=1).pack(side="left")
        Radiobutton(select2, text="multiple", variable=v, value=2).pack(side="left")
        v.set('1')
       
        eingaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        eingaberahmen.pack(fill="x")

        suchDatei = Label(eingaberahmen, text = 'File: ')
        suchDatei.grid(row=1,column=1)

        datei = Entry(eingaberahmen, width=45)
        datei.grid(row=1,column=2)

        dat = Button(eingaberahmen, text = 'search')
        dat.grid(row=1,column=3)

        suchPfad = Label(eingaberahmen, text = 'Directory: ')
        suchPfad.grid(row=2,column=1)

        path = Entry(eingaberahmen, width=45, state='disabled')
        path.grid(row=2,column=2)

        direct = Button(eingaberahmen, text = 'search',state='disabled')
        direct.grid(row=2,column=3)

        eingaberahmen2 = Frame(self.root)
        eingaberahmen2.pack()

        cancel = Button(eingaberahmen2, text = 'Cancel')
        cancel.pack(side='left')
        ok = Button(eingaberahmen2, text = 'OK')
        ok.pack(side='left')

        ausgaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        ausgaberahmen.pack(fill="x")

        ausgabeLab = Label(ausgaberahmen, text = 'Messagescreen').pack(side = "top", anchor="w")

        ausgabe = ScrolledText.ScrolledText(ausgaberahmen, width=61, height=10, state='disabled', bg='white')
        ausgabe.pack()
        #set_out('Please select a file for conversion.', 'y')

convert = convertWindow()
convert.root.mainloop()
Ich habe aus root self.root gemacht, set_out() auskommentiert, da ich es nicht habe und bei mainloop auf das richtige root vercodet.

Hoffe, es ist das was du wolltest.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Also auf die Schnelle:
-) root.mainloop() gehört noch in die Klasse rein (unter set_out)
-) set_out soll ja anscheinend eine Funktion sein. Wo is die denn definiert?

EDIT: *seufz* war zu langsam :wink:

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

mawe hat geschrieben: -) root.mainloop() gehört noch in die Klasse rein (unter set_out)
-) set_out soll ja anscheinend eine Funktion sein. Wo is die denn definiert?
Auch eine gute Lösung :), wenn nicht sogar besser. Das Problem ist nur, dass du dann aus anderen Funktionen keinen Zugriff auf root hast.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

hi.. und schonmal danke..

set_out ist noch nicht in eine klasse integriert deshalb hab ich es nicht gepostet.. ist folgendermaßen definiert:

Code: Alles auswählen

def set_out(text, opt):
    text = text + '\n--------------------------------------------------------------------------------------------------------------------------\n'
    ausgabe["state"] = "normal"
    if (opt == 'y'):
        ausgabe.delete(1.0,END)
    ausgabe.insert(END, str(text))
    ausgabe["state"] = "disabled"
    ausgabe.see(END)
ich hab jetzt mal die lösung von leonidas probiert.. und komischerweise gibt er jetzt den fehler aus: global name root is not defined...
gut wenn ich global root in den code einfüge .. dann umgeh ich das.. aber gibts da auch ne elegantere lösung?
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Du hast nicht zufällig vergessen self.root zu schreiben, wie's Leonidas gezeigt hat?

Code: Alles auswählen

class convertWindow:
    def __init__(self):
        self.root=Tk()    # <-
Gruß, mawe
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

nein.. nein..

das ist es ja was mich wundert!
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Seltsam ... hast Du auch überall sonst im Script root in self.root umgeschrieben. Bei mir funktionierts nämlich.

Gruß, mawe
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

wie schaut denn die Zeile aus wo der Fehler angezeigt wird, bzw. die ganze Fehlermeldung?


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

okay ... hatte sich doch noch ein root versteckt :oops:

code schaut nun so aus:

Code: Alles auswählen

#---------------------------------------------------------
# imports

import os
import string
import re
import tkFileDialog
import ScrolledText
from Tkinter import *

#---------------------------------------------------------
# print messages to messagescreen

def set_out(text, opt):
    text = text + '\n--------------------------------------------------------------------------------------------------------------------------\n'
    ausgabe["state"] = "normal"
    if (opt == 'y'):
        ausgabe.delete(1.0,END)
    ausgabe.insert(END, str(text))
    ausgabe["state"] = "disabled"
    ausgabe.see(END)
    

#---------------------------------------------------------
# build gui

class convertWindow:
    def __init__(self):
        
        global ausgabe

        self.root=Tk()

        frame=Frame(self.root)
        frame.pack(expand=YES)

        self.root.title('XML converter vol 1.0')

        selectrahmen = Frame(self.root, relief="groove", borderwidth="2")
        selectrahmen.pack(fill="x")

        select1 = Frame(selectrahmen)
        select1.pack(fill="x")
        select2 = Frame(selectrahmen)
        select2.pack(fill="x")

        selectLab = Label(select1, text='Would you like to convert a single file or multiple files?')
        selectLab.pack(side = "top", anchor="w")

        v = IntVar()
        Radiobutton(select2, text="single", variable=v, value=1).pack(side="left")
        Radiobutton(select2, text="multiple", variable=v, value=2).pack(side="left")
        v.set('1')
        
        eingaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        eingaberahmen.pack(fill="x")

        suchDatei = Label(eingaberahmen, text = 'File: ')
        suchDatei.grid(row=1,column=1)

        datei = Entry(eingaberahmen, width=45)
        datei.grid(row=1,column=2)

        dat = Button(eingaberahmen, text = 'search')
        dat.grid(row=1,column=3)

        suchPfad = Label(eingaberahmen, text = 'Directory: ')
        suchPfad.grid(row=2,column=1)

        path = Entry(eingaberahmen, width=45, state='disabled')
        path.grid(row=2,column=2)

        direct = Button(eingaberahmen, text = 'search',state='disabled')
        direct.grid(row=2,column=3)

        eingaberahmen2 = Frame(self.root)
        eingaberahmen2.pack()

        cancel = Button(eingaberahmen2, text = 'Cancel')
        cancel.pack(side='left')
        ok = Button(eingaberahmen2, text = 'OK')
        ok.pack(side='left')

        ausgaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        ausgaberahmen.pack(fill="x")

        ausgabeLab = Label(ausgaberahmen, text = 'Messagescreen').pack(side = "top", anchor="w")

        ausgabe = ScrolledText.ScrolledText(ausgaberahmen, width=61, height=10, state='disabled', bg='white')
        ausgabe.pack()
        set_out('Please select a file for conversion.', 'y')

convert = convertWindow()
convert.root.mainloop()

soweit so gut..
könnte mir jetzt einer sagen wie ich meine funktionen schön unterbringe?
also neben dem set_out gibts ja doch noch einige mehr
macht man sowas am besten in ne eigene klasse?
oder was macht man?
und.. wie kann ich die definition von "global ausgabe" verhindern.. auch mit self *probier* ??
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

powerslide hat geschrieben:könnte mir jetzt einer sagen wie ich meine funktionen schön unterbringe?
also neben dem set_out gibts ja doch noch einige mehr
macht man sowas am besten in ne eigene klasse?
oder was macht man?
und.. wie kann ich die definition von "global ausgabe" verhindern.. auch mit self *probier* ??

Code: Alles auswählen

self.ausgabe = blabla...
würe mir einfallen. Was die Methoden angeht: hängt ab, du kannst es natürlich machen, wenn du denkst, dass es thematisch in die Klasse passt, zum beispiel, wenn sie Variablen der Klasse modifizieren. Alternative wäre es auch, sie in ein anderes Modul zu verschieben, so hat man auch einige Ordnung.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Warum schmeisst Du set_out nicht einfach in die Klasse rein?

Code: Alles auswählen

set_out(self, text, opt):
 ...
Aufgerufen wird sie dann mit self.set_out(...). ausgabe noch in self.ausgabe ändern und fertig :wink:

EDIT: *argh* Leonidas war wieder mal schneller.
@Leonidas: self.ausgabe = ... funktioniert aber nur, wenn set_out in der Klasse ist.

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

mawe hat geschrieben:EDIT: *argh* Leonidas war wieder mal schneller.
@Leonidas: self.ausgabe = ... funktioniert aber nur, wenn set_out in der Klasse ist.
Deswegen lade ich die Seite ja auch alle paar Sekunden neu ;)

Das wäre jetzt so ein guter Grund self.set_out in die Klasse zu Verschieben. Global zu vermeiden ist ein sehr guter Grund.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

hmm.. wenn ich alle funktionen dann aber in die klasse schiebe.. dann hab ich am ende aber doch wieder den selben "kauderwelsch" wie vorher ohne Klasse .. oder?

also was noch fehlt ..
die funktionen für die search schaltflächen
die cancel funktion
und die funktion die die windowbehaviour ändert je nachdem ob single oder multiple angewält ist ..

naja und dann die eigene convertierungsfunktion..

hmm.. die evtl in ne eigene klasse?
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Naja, so grossartig viel is das ja auch wieder nicht, als dass "Kauderwelsch" entstehen könnte :wink:
Alles was mit der GUI zu tun hat, würde ich in die Klasse schmeissen, die Convertierungsfunktion von mir aus in eine eigene (aber das hast Du ja schon selbst gesagt).

EDIT: Wenn dir sehr fad ist, könntest Du z.B. aus den Search-Buttons eine eigene Klasse mit zugehörender Funktion erstellen. Nur so eine Idee ...

Hihi, jetzt war ich schneller :)

Gruß, mawe
Zuletzt geändert von mawe am Donnerstag 20. Januar 2005, 15:41, insgesamt 1-mal geändert.
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

okay.. dann bestel ich das gui zeug mal mit rein.. danach nerv ich euch nomma :)

schonmal danke für die hilfe!



hm.. schaut doch schon ganz gut aus.. bissl viele self's :P

Code: Alles auswählen

#---------------------------------------------------------
# imports

import os
import string
import re
import tkFileDialog
import ScrolledText
from Tkinter import *

class convertWindow:

#---------------------------------------------------------
# build gui

    def __init__(self):
        
        self.root=Tk()

        frame=Frame(self.root)
        frame.pack(expand=YES)

        self.root.title('XML converter vol 1.0')

        selectrahmen = Frame(self.root, relief="groove", borderwidth="2")
        selectrahmen.pack(fill="x")

        select1 = Frame(selectrahmen)
        select1.pack(fill="x")
        select2 = Frame(selectrahmen)
        select2.pack(fill="x")

        selectLab = Label(select1, text='Would you like to convert a single file or multiple files?')
        selectLab.pack(side = "top", anchor="w")

        self.v = IntVar()
        Radiobutton(select2, text="single", variable=self.v, value=1, command=lambda: self.sing()).pack(side="left")
        Radiobutton(select2, text="multiple", variable=self.v, value=2, command=lambda: self.mult()).pack(side="left")
        self.v.set('1')
        
        eingaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        eingaberahmen.pack(fill="x")

        suchDatei = Label(eingaberahmen, text = 'File: ')
        suchDatei.grid(row=1,column=1)

        self.datei = Entry(eingaberahmen, width=45)
        self.datei.grid(row=1,column=2)

        self.dat = Button(eingaberahmen, text = 'search', command=lambda: self.get_file())
        self.dat.grid(row=1,column=3)

        suchPfad = Label(eingaberahmen, text = 'Directory: ')
        suchPfad.grid(row=2,column=1)

        self.path = Entry(eingaberahmen, width=45, state='disabled')
        self.path.grid(row=2,column=2)

        self.direct = Button(eingaberahmen, text = 'search',state='disabled', command=lambda: self.get_dir())
        self.direct.grid(row=2,column=3)

        eingaberahmen2 = Frame(self.root)
        eingaberahmen2.pack()

        self.cancel = Button(eingaberahmen2, text = 'Cancel', command=lambda: self.can())
        self.cancel.pack(side='left')
        self.ok = Button(eingaberahmen2, text = 'OK')
        self.ok.pack(side='left')

        ausgaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        ausgaberahmen.pack(fill="x")

        ausgabeLab = Label(ausgaberahmen, text = 'Messagescreen').pack(side = "top", anchor="w")

        self.ausgabe = ScrolledText.ScrolledText(ausgaberahmen, width=61, height=10, state='disabled', bg='white')
        self.ausgabe.pack()
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# get directory

    def get_dir(self):
        self.path.insert(0,tkFileDialog.askdirectory())

#---------------------------------------------------------
# get filepath

    def get_file(self):
        self.datei.insert(0,tkFileDialog.askopenfilename())

#---------------------------------------------------------
# cancel

    def can(self):
        old1 = self.path["state"]
        old2 = self.datei["state"]
        self.path["state"] = "normal"
        self.datei["state"] = "normal"                 
        self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path["state"] = old1
        self.datei["state"] = old2
        self.v.set('1')
        self.path["state"] = "disabled"
        self.direct["state"] = "disabled"
        self.datei["state"] = "normal"
        self.dat["state"] = "normal"
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert a single file window behaviour
    
    def sing(self):
        self.path.delete(0,END)
        #self.datei.delete(0,END)
        self.path["state"] = "disabled"
        self.direct["state"] = "disabled"
        self.datei["state"] = "normal"
        self.dat["state"] = "normal"
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert multiple files window behaviour
   
    def mult(self):
        #self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path["state"] = "normal"
        self.direct["state"] = "normal"
        self.datei["state"] = "disabled"
        self.dat["state"] = "disabled"
        self.set_out('Please select a directory to make the rogram search for files.\nNote: ALL xml files will be converted!', 'y')

#---------------------------------------------------------
# print messages to messagescreen

    def set_out(self, text, opt):
        text = text + '\n--------------------------------------------------------------------------------------------------------------------------\n'
        self.ausgabe["state"] = "normal"
        if (opt == 'y'):
            self.ausgabe.delete(1.0,END)
        self.ausgabe.insert(END, str(text))
        self.ausgabe["state"] = "disabled"
        self.ausgabe.see(END)

#---------------------------------------------------------
# start gui

convert = convertWindow()
convert.root.mainloop()
weiter gehts wahrscheinlich erst am dienstag.. muss bis montag noch nen vortrag vorbereiten.. bis denne

slide
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

so.. hier der aktuelle stand

Code: Alles auswählen

#---------------------------------------------------------
# imports

import os
import string
import re
import tkFileDialog
import tkMessageBox
import ScrolledText
from Tkinter import *

class convertWindow:

#---------------------------------------------------------
# build gui

    def __init__(self):
        
        self.root=Tk()

        frame=Frame(self.root)
        frame.pack(expand=YES)

        self.root.title('XML converter vol 1.0')

        selectrahmen = Frame(self.root, relief="groove", borderwidth="2")
        selectrahmen.pack(fill="x")

        select1 = Frame(selectrahmen)
        select1.pack(fill="x")
        select2 = Frame(selectrahmen)
        select2.pack(fill="x")

        selectLab = Label(select1, text='Would you like to convert a single file or multiple files?')
        selectLab.pack(side = "top", anchor="w")

        self.v = IntVar()
        Radiobutton(select2, text="single", variable=self.v, value=1, command=self.sing).pack(side="left")
        Radiobutton(select2, text="multiple", variable=self.v, value=2, command=self.mult).pack(side="left")
        self.v.set('1')
        
        eingaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        eingaberahmen.pack(fill="x")

        suchDatei = Label(eingaberahmen, text = 'File: ')
        suchDatei.grid(row=1,column=1)

        self.datei = Entry(eingaberahmen, width=45)
        self.datei.grid(row=1,column=2)

        self.dat = Button(eingaberahmen, text = 'search', command=self.get_file)
        self.dat.grid(row=1,column=3)

        suchPfad = Label(eingaberahmen, text = 'Directory: ')
        suchPfad.grid(row=2,column=1)

        self.path = Entry(eingaberahmen, width=45, state='disabled')
        self.path.grid(row=2,column=2)

        self.direct = Button(eingaberahmen, text = 'search',state='disabled', command=self.get_dir)
        self.direct.grid(row=2,column=3)

        eingaberahmen2 = Frame(self.root)
        eingaberahmen2.pack()

        self.cancel = Button(eingaberahmen2, text = 'Cancel', command=self.can)
        self.cancel.pack(side='left')
        self.ok = Button(eingaberahmen2, text = 'OK', command=self.init)
        self.ok.pack(side='left')

        ausgaberahmen = Frame(self.root, relief="groove", borderwidth="2")
        ausgaberahmen.pack(fill="x")

        ausgabeLab = Label(ausgaberahmen, text = 'Messagescreen').pack(side = "top", anchor="w")

        self.ausgabe = ScrolledText.ScrolledText(ausgaberahmen, width=61, height=10, state='disabled', bg='white')
        self.ausgabe.pack()
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# get directory

    def get_dir(self):
        self.path.insert(0,tkFileDialog.askdirectory())

#---------------------------------------------------------
# get filepath

    def get_file(self):
        self.datei.insert(0,tkFileDialog.askopenfilename())

#---------------------------------------------------------
# cancel

    def can(self):
        old1 = self.path["state"]
        old2 = self.datei["state"]
        self.path["state"] = "normal"
        self.datei["state"] = "normal"                 
        self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path["state"] = old1
        self.datei["state"] = old2
        self.v.set('1')
        self.path["state"] = "disabled"
        self.direct["state"] = "disabled"
        self.datei["state"] = "normal"
        self.dat["state"] = "normal"
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert a single file window behaviour
    
    def sing(self):
        self.path.delete(0,END)
        #self.datei.delete(0,END)
        self.path["state"] = "disabled"
        self.direct["state"] = "disabled"
        self.datei["state"] = "normal"
        self.dat["state"] = "normal"
        self.set_out('Please select a file for conversion.', 'y')

#---------------------------------------------------------
# convert multiple files window behaviour
   
    def mult(self):
        #self.path.delete(0,END)
        self.datei.delete(0,END)
        self.path["state"] = "normal"
        self.direct["state"] = "normal"
        self.datei["state"] = "disabled"
        self.dat["state"] = "disabled"
        self.set_out('Please select a directory to make the rogram search for files.\nNote: ALL xml files will be converted!', 'y')

#---------------------------------------------------------
# print messages to messagescreen

    def set_out(self, text, opt):
        text = text + '\n--------------------------------------------------------------------------------------------------------------------------\n'
        self.ausgabe["state"] = "normal"
        if (opt == 'y'):
            self.ausgabe.delete(1.0,END)
        self.ausgabe.insert(END, str(text))
        self.ausgabe["state"] = "disabled"
        self.ausgabe.see(END)

#---------------------------------------------------------
# start conversion

    def init(self):
        conversion = conv()

#---------------------------------------------------------
# conversion

class conv:

    def __init__(self):

        x = convert.v.get()
        if (x == 1):
            pfad = convert.datei.get()
            print pfad
            convert.set_out(pfad, 'n')
            if (pfad == ''):
                tkMessageBox.showerror('Error','You must specify a file to convert!')
                return
            self.convertfile(pfad)
            pfad, filename = os.path.split(pfad)
            self.bak_killer_call(pfad)
            self.restart()
        elif (x == 2):
            pfad = convert.path.get()
            convert.set_out(pfad, 'n')
            if (pfad == ''):
                tkMessageBox.showerror('Error','You must specify a directory!')
                return
            self.multipleFiles(pfad, '.xml')
            self.bak_killer_call(pfad)
            self.restart()

#---------------------------------------------------------
# restart program or quit

    def restart(self):
        eingabe = tkMessageBox.askyesno('More...','Would you like to convert more files?')
        if (eingabe == 'True'):
            print 'true'
            return
        elif (eingabe == 'False'):
            print 'false'
            convert.set_out('phasing down application','n')
            convert.root.destroy()

#---------------------------------------------------------    
# filter definitions
    
    def f1(self, text):
        return text.replace("[","").replace("]","")

    def f2(self, text, old, new):
        while 1:
            ort = re.search (old, text)
            if ort == None:
                break
            text = re.sub (old, new, text)
        return text

    def f3(self, text):
        while 1:
            ort = re.search ('(.+?)', text)
            if ort == None:
                break
            text = re.sub('(.+?)', r'\1', text)
        return text     

#---------------------------------------------------------
# multiple file search and convert
  
    def multipleFiles(self, path, extension, depth=0):
        for item in os.listdir(path):
            itemWithPath = os.path.join(path, item)
            if item.endswith(extension):
                datei = itemWithPath
                convert.set_out('Starting conversion', 'n')
                in_file = open(datei,"r")
                inhalt = in_file.read()
                in_file.close()
                bak = datei + '_bak'
                try:
                    bak_file = open(bak, 'w')
                    bak_file.write(inhalt)
                    bak_file.close()
                except IOError:
                    convert.set_out('Backup file could not be generated','n')
                new_string = str(inhalt)
                new_string = string.replace(new_string, '[Q-]', '')
                new_string = string.replace(new_string, '[PM-]', '')
                new_string = string.replace(new_string, '[role]', '')
                #new_string = f1(new_string)
                new_string = self.f3(new_string)
                new_string = self.f2(new_string, '', '')
                new_string = self.f2(new_string, '', '')
                try:
                    out_file = open(datei, "w")    
                except IOError:
                    convert.set_out('File could not be opened!','n')
                out_file.write(new_string)
                out_file.close()
                convert.set_out('File converted and written','n')
            if os.path.isdir(itemWithPath):
                multipleFiles(itemWithPath, extension, depth + 1)

#---------------------------------------------------------
# single file convert

    def convertfile(self, datei):
        convert.set_out('Starting conversion','n')
        ext_match = datei.endswith('.xml')
        if (ext_match == 'False'):
            tkMessageBox.showerror('Error','Invalid File!')
            return
        in_file = open(datei,"r")
        inhalt = in_file.read()
        in_file.close()
        bak = datei + '_bak'
        try:
            bak_file = open(bak, 'w')
            bak_file.write(inhalt)
            bak_file.close()
        except IOError:
            convert.set_out('Backup file could not be generated','n')
        new_string = str(inhalt)
        new_string = string.replace(new_string, '[Q-]', '')
        new_string = string.replace(new_string, '[PM-]', '')
        new_string = string.replace(new_string, '[role]', '')
        new_string = self.f1(new_string)
        new_string = self.f3(new_string)
        new_string = self.f2(new_string, '', '')
        new_string = self.f2(new_string, '', '')
        try:
            out_file = open(datei, "w")    
        except IOError:
            convert.set_out('File could not be opened!','n')
        out_file.write(new_string)
        out_file.close()
        convert.set_out('File converted and written','n')

#---------------------------------------------------------
# bak_killer call

    def bak_killer_call(self, pfad):
        convert.set_out('starting remove engine','n')
        eingabe = tkMessageBox.askyesno('Remove backup?','Would you like to remove the backup [*.xml_bak] files?')
        if (eingabe == 'False'):
            convert.set_out('To remove backup files, simply run bak_remover.','n')
            return
        elif (eingabe == 'True'):
            bak_killer(pfad, '.xml_bak')

#---------------------------------------------------------
# backup killer                

    def bak_killer(self, path, extension, depth=0):
        for item in os.listdir(path):
            itemWithPath = os.path.join(path, item)
            if item.endswith(extension):
                os.remove (itemWithPath)
            if os.path.isdir(itemWithPath):
                bak_killer(itemWithPath, extension, depth + 1)


#---------------------------------------------------------
# start gui

convert = convertWindow()
convert.root.mainloop()




funktioniert .. naja .. halb :P

zumindest bekomm ich langsam ein gefühl für klassen.. und das ist ja schonmal was wert..

was er aber z.b. nicht macht ist das löschen der backup dateien..
sehr komisch das.. die funktion an sich.. ohne gui funktioniert ganz hervorragend.. und beim restart .. ja.. da macht er quasi gar nix.. es kommt zwar die message box .. aber das wars au wieder *grübel*
Zuletzt geändert von powerslide am Dienstag 25. Januar 2005, 16:05, insgesamt 1-mal geändert.
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Hab den Code nur mal kurz überflogen, darum auch nur ein kleiner Hinweis:
Wenn Du bei z.B. einem Button als command eine Funktion ohne Argumente aufrufst, brauchst Du kein lambda.

Code: Alles auswählen

self.dat = Button(eingaberahmen, text = 'search', command=self.get_file) 
Gruß, mawe
powerslide
User
Beiträge: 51
Registriert: Freitag 10. Dezember 2004, 09:05
Wohnort: Erlangen
Kontaktdaten:

okay.. also das lambda ist weg..

und ich glaub ich weiss wo der fehler liegt..

bei den askyesno teilen.. vermute ich.. hab aber keine ahnung wieso..
ihr vielleicht?

und irgendwie haut das mit meinem messagewindow (set_out anweisungen) auch nicht hin.. also haut schon hin aber er gibt das immer blockweise aus.. das ist doof!
How many people can read hex if only you and dead people can read hex?

There are 10 types of people in the world: Those who understand binary, and those who don't...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Ich glaub ich hab's:

Code: Alles auswählen

def bak_killer_call(self, pfad):
        convert.set_out('starting remove engine','n')
        eingabe = tkMessageBox.askyesno('Remove backup?','Would you like to remove the backup [*.xml_bak] files?')
        if not eingabe:      # statt == 'False'
            convert.set_out('To remove backup files, simply run bak_remover.','n')
            return
        else:
            self.bak_killer(pfad, 'xml_bak')    # kein . vor der Endung!  self !
Gruß, mawe
Antworten