Seite 1 von 1

wxpython ?? Anfängerfragen

Verfasst: Dienstag 10. August 2004, 10:26
von buschdel
Hi,

ich hab ein kleines Programm geschrieben das Dateien in bestimmten Ordnern kopiert und entsprechend umbenennt. Jetzt hab ich mit wxpython eine kleine Oberfläche gebaut mit der man mit Hilfe von radiobuttons den entsprechenden order auswählen kann.

nun zu meinem Problem
  • wie kann ich dem Nutzer zeigen das das Programm auch wirklich läuft
  • mein Beenden Button bringt mir immer ne Fehlermeldung, wie waer der richtige Code ??

Code: Alles auswählen

def OnClick_b2(self, event):        ## Beenden der Anwendung
        self.Destroy()
        self.parent.Destroy()
        print 'Ciao'
War mir nicht sicher ob ich den ganzen Code hier pasten darf, in manchen Foren wird das nicht so gerne gesehn. Bitte um Hilfe !! Danke !

Greetz Buschdel

Verfasst: Dienstag 10. August 2004, 10:43
von buschdel
jetzt ist mir noch aufgefallen das sobald ich mein aktives Programmfenster verschiebe, das Fenster im Hintergrund stehen bleibt. Ich ziehe also eine Art Spur die erst verschwindet wenn ich z.B. einen Knopf in meinem Programm betätige ...... wer weiß Rat ??
Fehlt mir ein bestimmter Befehl ??

Greetz Tobias

Verfasst: Dienstag 10. August 2004, 10:45
von mawe
Hi!
bushdel hat geschrieben: War mir nicht sicher ob ich den ganzen Code hier pasten darf, in manchen Foren wird das nicht so gerne gesehn. Bitte um Hilfe !! Danke !
Naja, wenns nicht zu lang ist ... :wink:
Es würde wahrscheinlich eher helfen, wenn Du uns die Fehlermeldung verrätst.

Gruß, mawe

Verfasst: Dienstag 10. August 2004, 12:15
von buschdel
mawe hat geschrieben:Hi!


Es würde wahrscheinlich eher helfen, wenn Du uns die Fehlermeldung verrätst.

Gruß, mawe

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\pytest\Tools\all-in-1.py", line 162, in OnClick_b2
    self.parent.Destroy()
  File "C:\Python23\Lib\site-packages\wx\core.py", line 9344, in __getattr__
    raise PyDeadObjectError(self.attrStr % self._name)
wx.core.PyDeadObjectError: The C++ part of the MyPanel object has been deleted, attribute access no longer allowed.
und ?

Verfasst: Dienstag 10. August 2004, 12:32
von Dookie
Hi buschdel,

Code: Alles auswählen

def OnClick_b2(self, event):        ## Beenden der Anwendung
        self.Destroy()        # hier wird self zerstört
        self.parent.Destroy() # hier kannst nichtmehr auf self.parent zugreifen!
        print 'Ciao'
folgendes sollte besser klappen.

Code: Alles auswählen

def OnClick_b2(self,event):
    parent = self.parent
    self.Destroy()
    parent.Destroy()
    print 'Ciao'
Hat wxPython eigentlich kein mainquit()? Das wär wohl die beste Möglichkeit um ein Programm zu beenden.


Gruß

Dookie

mehr probleme

Verfasst: Dienstag 10. August 2004, 12:47
von buschdel
sorry das ich immer mehr neue Fragen stelle, aber die wxpython doku ist ziemlich schwierig :(

Momentan sieht mein Programm so aus
Bild

ich hätte aber gerne noch so eine Art Statusfenster, in dem ich sehe was mein Programm grade macht, so ungefähr ..... wie geht das ???
Bild

@Dookie, danke für die Hilfe, klappt zwar noch nicht, aber ich denke ich weiß jetzt woran es liegt.

Tobias

Verfasst: Dienstag 10. August 2004, 12:56
von mawe
Dookie hat geschrieben: Hat wxPython eigentlich kein mainquit()?
Naja, es gibt ExitMainLoop().

@buschdel: reicht es eigentlich nicht, wenn Du nur self.parent.Destroy() verwendest?

Gruß, mawe

Verfasst: Dienstag 10. August 2004, 13:14
von buschdel
also irgendwie komm ich immernochnicht sauber aus meinem Programm raus, frag mich (bzw euch) nur warum

Code: Alles auswählen

#----------------- B E N U T Z E R O B E R F L A E C H E -------------------

class MyPanel(wxPanel):

    pathread    = L_pathread[0]              ## Standardquellpfad
    pathwrite   = L_pathwrite[0]              ## Standardzielpfad
        
    def __init__(self, parent, log):
        self.log        = log
        self.Bildtypen  = 0                   ## Standart ==> Bedienstete  
        wxPanel.__init__(self, parent, -1)

        b1 = wxButton(self, 10, "Start", wxPoint(35, 300))
        EVT_BUTTON(self, 10, self.OnClick_b1)

        b2 = wxButton(self, 20, "Beenden", wxPoint(130, 300))
        EVT_BUTTON(self, 20, self.OnClick_b2)

        rb1 = wxRadioBox(self, 30, "Auswahl des Quellordners", wxPoint(35, 30), wxDefaultSize,
                         L_Bildtypen, 1, wxRA_SPECIFY_COLS)
        EVT_RADIOBOX(self, 30, self.EvtRadioBox_rb1)


    def EvtRadioBox_rb1(self, event):
        self.Bildtypen  = event.GetSelection()
        self.pathread = L_pathread[self.Bildtypen]
        self.pathwrite = L_pathwrite[self.Bildtypen]
        print 'Quelle: ' + self.pathread
        print 'Ziel: ' + self.pathwrite 

    def OnClick_b1(self, event):        ## Starten
            copypaste_images(self.pathread, self.pathwrite)


##    def OnClick_b2(self, event):        
##        self.Destroy()
##        self.parent.Destroy()
##        print 'Ciao'
    def OnClick_b2(self,event):     ## Beenden der Anwendung
        self.parent.Destroy()
        print 'Ciao'
Fehlermeldung

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\pytest\Tools\all-in-1.py", line 169, in OnClick_b2
    self.parent.Destroy()
AttributeError: 'MyPanel' object has no attribute 'parent'
Hoffe ich nerve nicht

Gruß Tobias

Verfasst: Dienstag 10. August 2004, 13:20
von mawe
AttributeError: 'MyPanel' object has no attribute 'parent'
Daran liegt's. Schreib mal:

Code: Alles auswählen

def __init__(self, parent, log): 
    self.parent = parent
...
Dann sollte es funktionieren :wink:

Gruß, mawe

Verfasst: Dienstag 10. August 2004, 13:33
von buschdel
hui !!! Supi !! funzt einwandfrei, danke. Hätt ich auch selbst drauf kommen können, aber ihr kennt ja den Spruch mit den Bäumen und dem Wald ;)
Jetzt bräucht ich nurnoch nen Tip wie ich die Meldungen die ich über print ausgebe, in nem dynamischen Textfeld ausgeben kann.
wie in dem o.g. Bild

Kann mir da evtl auch noch jmd weiterhelfen ?
Gruß Tobias

Verfasst: Dienstag 10. August 2004, 13:45
von mawe
Naja, ich würd wxTextCtrl verwenden

Code: Alles auswählen

t = wxTextCtrl(self,-1,"",wxSize(300,100),style=wxTE_MULTILINE)
und statt print einfach mit

Code: Alles auswählen

t.WriteText("der Text\n")
schreiben.

Gruß, mawe

Verfasst: Dienstag 10. August 2004, 13:50
von buschdel
danke, versuch ich gleich mal

wxPython

Verfasst: Dienstag 10. August 2004, 16:33
von intruder0815
Hallo buschdel,

bei solchen Sachen schaue ich immer in die wxPython Demo
rein, ob dort schon sowas implementiert ist was ich auch
benötigte und meistens findet man dort auch solchen Sachen.
Du kannst auch eine LogKlasse machen, die in das Textfeld schreibt.
Ich hab mal eine LogKlasse hier, die zwar in ein Logfile schreibt,
aber das kann man ja schnell ändern.

Code: Alles auswählen

from wxPython.wx import *
##
# <br></br>
# class to log all needed info into a file<br></br>
#
# @param logfile path and name of the logfile
# @param parent parent window to show the Error dlg as popup
#
class MyLog(wxPyLog):
    def __init__(self, logfile, parent):
        wxPyLog.__init__(self)
        #self.parent = parent
        try:
            self.logfile = open(logfile, 'a')
            if not (self.logfile):
                ShowErrorDlg(self.parent, 'Logfile', 'Could not open logfile\nplease call your administrator')
        except:
            ShowErrorDlg(self.parent, 'Logfile', 'Could not open logfile\nplease call your administrator')
    ##########################################################################       
 
    ##
    # <br></br>
    # writes the info to the logfile
    #
    # @param message string to write
    #
    def DoLogString(self, message, *argv):
        #try:
            message = getTime() + ": " + str(message)
            self.logfile.write(str(message) + '\n')
            self.logfile.flush()
        #except:
        #    pass
    ##########################################################################       
 
    ##
    # <br></br>
    # close the logfile
    #
    def Exit(self):
        try:
            self.logfile.close()
        except:
            pass

und so wird das dann implementiert

Code: Alles auswählen

        # create new log stream into my logfile
        self.log = MyLog(LOGFILE, self.oOptionFrm)
        wxLog_SetActiveTarget(self.log)

        # send first data into the logfile
        wxLogMessage("\tstarting Application")
        wxLogMessage("")
        wxLogMessage("Client version %s" %VERSION)
        wxLogMessage("Current user: %s" %USR)
hoffentlich hilft das weiter

Gruß
Christian

Verfasst: Donnerstag 12. August 2004, 07:44
von buschdel
vielen Dank fuer die schnellen und guten Tips :lol:

gibt es denn eine fertige Funktion, die die Meldungen die normal in der Shell ausgegeben werden direkt in das Textfeld schreibt ??
Mit dem Tip von Intruder komm ich leider nicht so ganz klar :(

mfg
Buschdel

Verfasst: Donnerstag 12. August 2004, 09:27
von Christopy
Um die Standardausgabe umzuleiten reicht folgendes:

Code: Alles auswählen

txtctrl = wxTextCtrl( self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY )
sys.stdout = txtctrl
Ich vermute, dass Du stderr auch so umleiten kannst.

Verfasst: Donnerstag 12. August 2004, 14:19
von buschdel
genau, wirklich GENAU das hab ich gesucht
ICH WILL EIN KIND VON DIR ;)

mal im Ernst: Dangöööö

Greetz Buschdel