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 ...
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
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 ???
@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
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
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
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