wxpython ?? Anfängerfragen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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 ?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

danke, versuch ich gleich mal
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
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

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
Christopy
User
Beiträge: 131
Registriert: Montag 15. Dezember 2003, 22:39

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.
buschdel
User
Beiträge: 19
Registriert: Donnerstag 22. Juli 2004, 14:44
Kontaktdaten:

genau, wirklich GENAU das hab ich gesucht
ICH WILL EIN KIND VON DIR ;)

mal im Ernst: Dangöööö

Greetz Buschdel
Antworten