Module vfhauptfenster
[hide private]
[frames] | no frames]

Source Code for Module vfhauptfenster

  1  # -*- coding: utf-8 -*- 
  2  # 
  3  # 
  4  #    filename:  vfhauptfenster.py 
  5  # 
  6  #    version:   see wxvf.py 
  7  # 
  8  # 
  9  # ---------------------------------------------------------------------------------------- 
 10  # 
 11  # 
 12  #    Copyright (C) 2010  Michael Bellair 
 13  # 
 14  #    This file is part of wxvf. 
 15  #  
 16  #    wxvf is free software: you can redistribute it and/or modify 
 17  #    it under the terms of the GNU General Public License as published by 
 18  #    the Free Software Foundation, either version 3 of the License, or 
 19  #    (at your option) any later version. 
 20  # 
 21  #    wxvf is distributed in the hope that it will be useful, 
 22  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
 23  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 24  #    GNU General Public License for more details. 
 25  # 
 26  #    You should have received a copy of the GNU General Public License 
 27  #    along with wxvf.  If not, see <http://www.gnu.org/licenses/>. 
 28  # 
 29  #    Michael Bellair 
 30  #    Sportplatzstrasse 11 
 31  #    01259 Dresden 
 32  # 
 33  #    E-Mail:    bellair@freenet.de 
 34  #    homepage:  http://www.michaelbellair.de/vf/index.html 
 35  # 
 36  # 
 37  # ---------------------------------------------------------------------------------------- 
 38  # 
 39  import wx 
 40  from wx.lib.wordwrap import wordwrap 
 41   
 42  from bearbeitedokumente import BearbeiteDokumente       # Eingabeformular für Dokumente 
 43  from filter import Filter                               # Eingabeformular für den Filter 
 44  from gefahrenprotokoll import Gefahrenprotokoll         # Eingabeformular 'Gefahrenprotokoll' 
 45   
 46  from wxuniversal import FlexGridSizerWxObjTitel         # wxObjekt mit Titel 
 47  from wxuniversal import ComboBoxErg                     # wx.ComboBox mit Ergänzungen 
 48  from wxuniversal import ListBoxErg                      # wx.ListBox mit Ergänzungen 
 49   
 50  from progstart import ProgStart                         # Dialog 'Datenbankanmeldung' 
 51  from risikoanalyse import Risikoanalyse                 # Eingabeformular 'Risikoanalyse' 
 52   
 53  from datenbank import Datenbank, Fehler                 # Datenbankzugriff, Datenbankvariablen 
 54   
 55  import sys                                              # Programmende >sys.exit()< 
 56  import getpass                                          # Benutzername >getuser()< 
 57   
 58   
 59   
 60  # 
 61  # 
 62  # 
 63  # ---------------------------------------------------------------------------------------- 
 64  # ---------------------------------------------------------------------------------------- 
 65  # --                                    -------------------------------------------------- 
 66  # --    Offene Punkte / Aufgaben        -------------------------------------------------- 
 67  # --                                    -------------------------------------------------- 
 68  # ---------------------------------------------------------------------------------------- 
 69  # ---------------------------------------------------------------------------------------- 
 70  # 
 71  #  
 72  #       -- siehe TODO 'vfhauptfenster.py' -- 
 73  # 
 74  # 
 75  # ---------------------------------------------------------------------------------------- 
 76  # 
 77   
 78  # 
 79  # 
 80  # 
 81  # 
 82  # -------->>> Nächste Version des Datenbankmodells und GUI herausgeben --> Warnung ergänzen, daß Funktionen defekt sind 
 83  # 
 84  # 
 85  # -> 4.) Test ALLER Funktionen 
 86  #               -> Fehler beseitigen 
 87  #               -> Funktionen als Hilfe dokumentieren 
 88  # 
 89  # 
 90  # -> 5.) [Notizen] aus allen Texten entfernen 
 91  # 
 92  # 
 93  # -> 6.) redundante Aufrufe von >selektiere_...()< unterbinden / SQL-Abfragen bei Bedarf beschleunigen 
 94  # 
 95  # 
 96  #       -> selektiere__dokDoku()                -> SiAnfStrktDok(), bearbeitedokumente.py 
 97  #       -> selektiere__prtProtokoll()           -> SiAnfStrktDok() 
 98  # 
 99  #       -> selektiere__strStrkt()               -> SiAnfStrktDok() <- warum nicht beim Initialisieren ? 
100  # 
101  #       -> selektiere__GefszenId_AnmId()        -> bearbeiteanmerkung.py 
102  #       -> selektiere__sprWgruppe()             -> bearbeiteuebersetzung.py 
103  # 
104   
105   
106  # 
107  # 
108  # 
109  # ---------------------------------------------------------------------------------------- 
110  # ---------------------------------------------------------------------------------------- 
111  # --                    ------------------------------------------------------------------ 
112  # --    Hauptfenster    ------------------------------------------------------------------ 
113  # --                    ------------------------------------------------------------------ 
114  # ---------------------------------------------------------------------------------------- 
115  # ---------------------------------------------------------------------------------------- 
116  # 
117 -class VFHauptfenster( wx.Frame ):
118 """ 119 Klasse, die das Hauptfenster der Benutzeroberfläche repräsentiert. 120 121 @raise IOError: Fehlermeldung und Programmende, wenn die Konfigurationsdatei '.wxvf' nicht geöffnet werden kann. 122 @raise Fehler: Fehlermeldung und Programmende, wenn die Datenbankverbindung nicht hergestellt werden kann. 123 """ 124 125 # 126 # ------------------------------------------------------------------------------------ 127 # -- Hauptfenster initialisieren ------------------------------------------ 128 # ------------------------------------------------------------------------------------ 129 #
130 - def __init__(self, *args, **kwds):
131 kwds["style"] = wx.DEFAULT_FRAME_STYLE 132 wx.Frame.__init__(self, *args, **kwds) 133 134 # 135 # -------------------------------------------------------------------------------- 136 # -- Namen setzen (somit Klasse / Objekt erkennen) -------------------------- 137 # -------------------------------------------------------------------------------- 138 # 139 self.SetName( name = "VFHauptfenster" ) 140 141 142 143 # 144 # -------------------------------------------------------------------------------- 145 # -- Datenbankverbindung herstellen ------------------------------------------ 146 # -------------------------------------------------------------------------------- 147 # 148 149 # 150 # -- Konfigurationsdatei auslesen ------------------------------------------ 151 # 152 try: 153 confDatei=open('.wxvf', 'r') 154 except IOError: 155 dlg = wx.MessageDialog(self, 156 u"Die von 'wxvf' benötigte Konfigurationsdatei ist nicht vorhanden !\n\nBitte lege im Programmverzeichnis eine Textdatei mit dem Namen '.wxvf' an.\nBitte trage in der ersten Zeile im Format 'xxx.xxx.xxx.xxx' die IP-Adresse ein, über die der Datenbankserver (PostgreSQL) angesprochen werden kann (000.000.000.000 entspricht 'localhost').\nBitte trage in der zweiten Zeile den Datenbanknamen ein (maximal 25 Zeichen).\nIn der dritten Zeile kannst Du den Benutzernamen angeben (maximal 25 Zeichen).\n\n\'wxvf\' wird beendet." 157 , u"Fehlermeldung", wx.OK | wx.ICON_ERROR ) 158 dlg.ShowModal() 159 dlg.Destroy() 160 sys.exit() 161 162 163 # 164 # -- Die Zeichenbegrenzung soll vor 'Buffer Overflow' schützen: ---------- 165 # -- IP-Adresse (xxx.xxx.xxx.xxx) ---------- 166 # -- Datenbankname ---------- 167 # -- Datenbankbenutzername ---------- 168 # -- 'wxvf.log' anlegen ? ---------- 169 # 170 hostaddr = confDatei.readline()[0:15].strip() 171 dbName = confDatei.readline()[0:25].strip() 172 dbBenutzerName = confDatei.readline()[0:25].strip() 173 schreibProtokollDatei = ( confDatei.readline()[0:4].strip() == 'True' ) 174 175 confDatei.close() 176 177 178 179 # 180 # -- Datenbankbenutzername / -kennwort eingeben -------------------------- 181 # 182 if( len( dbBenutzerName ) == 0 ) : dbBenutzerName = getpass.getuser() 183 184 185 # 186 # -- später Aktivieren ! ---------------------------------------------------------- 187 # 188 dlg = ProgStart( self ) 189 dlg.CenterOnScreen() 190 dlg.text_ctrl_dbBenutzerName.ChangeValue( dbBenutzerName ) 191 if ( dlg.ShowModal() != wx.ID_OK ): 192 sys.exit() 193 194 dbBenutzerName = dlg.text_ctrl_dbBenutzerName.GetValue() 195 dbKennwort = dlg.text_ctrl_dbKennwort.GetValue() 196 dlg.Destroy() 197 198 199 200 # 201 # -- Verbindung zu 'vf' herstellen ------------------------------------------ 202 # 203 try: 204 self.dbVerbindung = Datenbank( dbName, dbBenutzerName, dbKennwort, hostaddr ) 205 """ 206 @cvar: Datenbankobjekt, welches die Datenbankverbindung enthält. 207 @type: libpq - PgConnection 208 """ 209 210 except Fehler, msg: 211 dlg = wx.MessageDialog( self, str( msg ), 'Fehlermeldung', wx.OK|wx.ICON_ERROR ) 212 dlg.ShowModal() 213 dlg.Destroy() 214 sys.exit() 215 216 217 # 218 # -- Protokolldatei anlegen ------------------------------------------ 219 # 220 self.dbVerbindung.ProtokolldateiErzeugen( schreibProtokollDatei = schreibProtokollDatei ) 221 222 223 224 # 225 # -- Formular 'Filter' initialisieren ---------------------------------- 226 # 227 dlg = wx.ProgressDialog( title = "Datenbankabfragen durchführen", 228 message = "Aktuelle Abfrage:", 229 parent=self, 230 style = wx.PD_APP_MODAL 231 | wx.PD_AUTO_HIDE ) 232 233 self.dbVerbindung.aktualisierePermanenteDatenstrukturen( wxProgressDialog = dlg, istFilter = False ) 234 235 236 237 # 238 # -------------------------------------------------------------------------------- 239 # -- Menüleiste ---------------------------------------------------------- 240 # -------------------------------------------------------------------------------- 241 # 242 self.hauptfenster_menubar = wx.MenuBar() 243 244 # 245 # -- Datei ------------------------------------------------------------------ 246 # 247 datei = wx.Menu() 248 datei.Append(102, u"&Speichern\tCtrl+S", u"Änderungen in der Datenbank ablegen", wx.ITEM_NORMAL) 249 datei.AppendSeparator() 250 datei.Append(103, u"&Beenden\tCtrl+B", u"Die Benutzeroberfläche 'wxvf' beenden.", wx.ITEM_NORMAL) 251 self.hauptfenster_menubar.Append(datei, u"&Datei") 252 253 # 254 # -- Filter ---------------------------------------------------------- 255 # 256 filter = wx.Menu() 257 filter.Append( 201, u"&Gefahrenszenarien einschränken", u"Filterkriterien zur Einschränkung der Gefahrenszenarien setzen.", wx.ITEM_NORMAL ) 258 self.hauptfenster_menubar.Append( filter, u"&Filter" ) 259 260 # 261 # -- Basisdaten ---------------------------------------------------------- 262 # 263 basisdaten = wx.Menu() 264 basisdaten.Append( 301, u"&Dokumente", u"Dokumente bearbeiten", wx.ITEM_NORMAL ) 265 self.hauptfenster_menubar.Append( basisdaten, u"&Basisdaten" ) 266 267 # 268 # -- Hilfe ------------------------------------------------------------------ 269 # 270 hilfe = wx.Menu() 271 hilfe.Append( 401, u"&Über wxvf", u"Informationen zum Programm", wx.ITEM_NORMAL ) 272 self.hauptfenster_menubar.Append( hilfe, u"&Hilfe" ) 273 274 # 275 # -- Menüleiste übernehmen -------------------------------------------------- 276 # 277 self.SetMenuBar( self.hauptfenster_menubar ) 278 279 # 280 # -- Menüereignisse behandeln 281 # 282 self.Bind( wx.EVT_MENU, self.__ereignisAenderungenSpeichern__, id=102 ) 283 self.Bind( wx.EVT_MENU, self.__ereignisProgrammBeenden__, id=103 ) 284 285 self.Bind( wx.EVT_MENU, self.__ereignisFilter__, id=201 ) 286 287 self.Bind( wx.EVT_MENU, self.__ereignisDokumente__, id=301 ) 288 289 self.Bind( wx.EVT_MENU, self.__ereignisUeberWxvf__, id=401 ) 290 291 292 # 293 # -------------------------------------------------------------------------------- 294 # -- Statusleiste ---------------------------------------------------------- 295 # -------------------------------------------------------------------------------- 296 # 297 self.Statusleiste = wx.StatusBar( self ) 298 self.Statusleiste.SetFieldsCount( 2 ) 299 self.Statusleiste.SetStatusWidths( [-7, -3] ) 300 self.SetStatusBar( self.Statusleiste ) 301 302 303 # 304 # -- Id und Status -------------------------------------------------- 305 # -- Objekt-Id = -221 -------------------------------------------------- 306 # 307 self.ListBox__GefIdStatus = FlexGridSizerWxObjTitel( parent = self 308 , wxObj = ListBoxErg( self 309 , size = ( -1, -1 ) 310 , style = wx.BORDER_SUNKEN | wx.LB_SORT 311 , Statusleiste = self.Statusleiste ) 312 , titel = u"Gef-Id / \nStatus" 313 , orient = wx.VERTICAL ) 314 self.ListBox__GefIdStatus.wxObjekt.nimmWerteStatusleiste( 315 DBSpNameErlaeuterung = u"Eineindeutige Identifikationsnummer des Gefahrenszenarios." 316 , DBSpName = "ps.gefszenario.id" ) 317 318 self.ListBox__GefIdStatus.wxObjekt.SetToolTip( wx.ToolTip( u"Doppelklick:\nBearbeitungsstatus (erledigt, offene Punkte, noch nicht bearbeitet) durchlaufen" ) ) 319 320 self.ListBox__GefIdStatus.wxObjekt.markiereWertProjUeb = False 321 322 self.Bind( wx.EVT_LISTBOX 323 , self.__ereignisNavigation__ 324 , self.ListBox__GefIdStatus.wxObjekt ) 325 326 327 # 328 # -- Tabulatorbereich (Risikoanalyse, Gefahrenprotokoll, ------------------ 329 # -- Terminplan, ...) ------------------ 330 # 331 self.Notebook__zentralerBereich = wx.Notebook( self ) 332 333 self.Notebook__zentralerBereich.AddPage( Risikoanalyse( parent = self.Notebook__zentralerBereich 334 , Statusleiste = self.Statusleiste 335 , dbVerbindung = self.dbVerbindung ) 336 , u"Risikoanalyse" ) 337 338 339 self.Notebook__zentralerBereich.AddPage( Gefahrenprotokoll( parent = self.Notebook__zentralerBereich 340 , Statusleiste = self.Statusleiste 341 , dbVerbindung = self.dbVerbindung ) 342 , u"Gefahrenprotokoll" ) 343 344 345 346 # 347 # -- Layout festlegen -------------------------------------------------- 348 # 349 FlexGridSizer = wx.FlexGridSizer( rows = 1, cols = 2, vgap = 5, hgap = 5 ) 350 FlexGridSizer.AddGrowableCol( idx = 1, proportion = 0 ) 351 FlexGridSizer.AddGrowableRow( idx = 0, proportion = 0 ) 352 353 FlexGridSizer.Add( self.ListBox__GefIdStatus 354 , flag = wx.LEFT|wx.TOP|wx.BOTTOM|wx.EXPAND 355 , border = 5 ) 356 357 FlexGridSizer.Add( self.Notebook__zentralerBereich 358 , flag = wx.TOP|wx.BOTTOM|wx.RIGHT|wx.EXPAND 359 , border = 5 ) 360 361 self.SetSizerAndFit( FlexGridSizer ) 362 363 364 365 # 366 # -- Eigenschaften des Fensters setzen ---------------------------------- 367 # 368 self.SetTitle(u"wxvf - 'Virtuelles Fahrzeug'") 369 self.Maximize( True ) 370 self.CenterOnScreen() 371 372 373 374 # 375 # -- Eingabeformular 'Filter' aufrufen ---------------------------------- 376 # 377 self.__ereignisFilter__()
378 379 380 381 # 382 # ------------------------------------------------------------------------------------ 383 # -- Änderungen speichern -------------------------------------------------- 384 # ------------------------------------------------------------------------------------ 385 #
386 - def __ereignisAenderungenSpeichern__( self, ereignisDummy ):
387 """ 388 Methode die aufgerufen wird, um alle Änderungen zu speichern. 389 390 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 391 @type ereignisDummy: C{wx - Ereignisobjekt} 392 """ 393 394 # 395 # -- Änderungen in die Datenbank schreiben ---------------------------------- 396 # 397 self.Notebook__zentralerBereich.GetPage(0).schreibDB() 398 self.Notebook__zentralerBereich.GetPage(1).schreibDB() 399 400 401 # 402 # -- Änderungen in der Datenbank endgültig übernehmen ------------------ 403 # -- (Postgres: COMMIT) ------------------ 404 # 405 self.dbVerbindung.nimmAenderungen()
406 407 408 409 410 # 411 # ------------------------------------------------------------------------------------ 412 # -- Dokumente bearbeiten -------------------------------------------------- 413 # ------------------------------------------------------------------------------------ 414 #
415 - def __ereignisDokumente__( self, ereignisDummy ):
416 """ 417 Dokumente bearbeiten. 418 419 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 420 @type ereignisDummy: C{wx - Ereignisobjekt} 421 """ 422 423 # 424 # -- Meldung ausgeben -------------------------------------------------- 425 # 426 dlg = BearbeiteDokumente( parent = self 427 , Statusleiste = self.Statusleiste 428 , dbVerbindung = self.dbVerbindung ) 429 430 dlg.CenterOnScreen() 431 dlg.ShowModal() 432 dlg.Destroy()
433 434 435 436 437 # 438 # ------------------------------------------------------------------------------------ 439 # -- Filterkriterien setzen -------------------------------------------------- 440 # ------------------------------------------------------------------------------------ 441 #
442 - def __ereignisFilter__( self, ereignisDummy = None ):
443 """ 444 Dokumente bearbeiten. 445 446 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 447 @type ereignisDummy: C{wx - Ereignisobjekt} 448 """ 449 450 # 451 # -- Meldung ausgeben -------------------------------------------------- 452 # 453 dlg = Filter( parent = self 454 , Statusleiste = self.Statusleiste 455 , dbVerbindung = self.dbVerbindung ) 456 457 dlg.CenterOnScreen() 458 dlg.ShowModal() 459 dlg.Destroy() 460 461 462 463 # 464 # -- Permanente Datenstrukturen in >Datenbank()< aktualisieren ---------- 465 # 466 dlg = wx.ProgressDialog( title = "Datenbankabfragen durchführen", 467 message = "Aktuelle Abfrage:", 468 parent=self, 469 style = wx.PD_APP_MODAL 470 | wx.PD_AUTO_HIDE ) 471 472 self.dbVerbindung.aktualisierePermanenteDatenstrukturen( wxProgressDialog = dlg ) 473 474 475 # 476 # -- Auswahlfelder, die permanente Datenstrukturen verwenden, ---------- 477 # -- aktualisieren ---------- 478 # 479 self.Notebook__zentralerBereich.GetPage(0).init_Risikoanalyse() 480 481 482 483 # 484 # -- Eingabeobjekte akualisieren, die nicht über die ------------------ 485 # -- Permanenten Datenstrukturen gefüllt werden ------------------ 486 # 487 # -- ACHTUNG ! JEDER Aufruf führt zur Datenbankabfrage ! ------------------ 488 # 489 self.dbVerbindung.selektiere__psGefszenario( self.ListBox__GefIdStatus.wxObjekt ) 490 491 492 493 # 494 # -- Tabulator 'Risikoanalyse', 'Gefahrenprotokoll' -------------------------- 495 # -- mit gültigen Werten füllen -------------------------- 496 # 497 self.__ereignisNavigation__()
498 499 500 501 502 503 # 504 # ------------------------------------------------------------------------------------ 505 # -- Navigationsereignisse behandeln ---------------------------------- 506 # ------------------------------------------------------------------------------------ 507 #
508 - def __ereignisNavigation__( self, ereignisDummy = None ):
509 """ 510 Methode die aufgerufen wird, wenn eine Gefahren-Id ausgewählt wurde. 511 512 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 513 @type ereignisDummy: C{wx - Ereignisobjekt} 514 """ 515 516 # 517 # -- Änderungen in die Datenbank schreiben ---------------------------------- 518 # 519 self.Notebook__zentralerBereich.GetPage(0).schreibDB() 520 self.Notebook__zentralerBereich.GetPage(1).schreibDB() 521 522 523 # 524 # -- Ereignis >wx.ListBox.Clear()< abfangen < -------------------------- 525 # 526 if( ereignisDummy != None 527 and self.ListBox__GefIdStatus.wxObjekt.GetClientData( self.ListBox__GefIdStatus.wxObjekt.GetSelection() ) == None ) : 528 return 529 530 531 # 532 # -- Gefahrenszenario-Id übernehmen ------------------------------------------ 533 # 534 self.dbVerbindung.nimm__PsGefszenarioId( wxListBox = self.ListBox__GefIdStatus.wxObjekt ) 535 536 537 # 538 # -- Tabulator 'Risikoanalyse' / 'Gefahrenszenario' -------------------------- 539 # -- mit gültigen Werten füllen -------------------------- 540 # 541 self.Notebook__zentralerBereich.GetPage(0).liesDB() 542 self.Notebook__zentralerBereich.GetPage(1).liesDB()
543 544 545 546 547 # 548 # ------------------------------------------------------------------------------------ 549 # -- Programm beenden -------------------------------------------------- 550 # ------------------------------------------------------------------------------------ 551 #
552 - def __ereignisProgrammBeenden__( self, ereignisDummy ):
553 """ 554 Methode die aufgerufen wird, um das Programm zu beenden. 555 556 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 557 @type ereignisDummy: C{wx - Ereignisobjekt} 558 """ 559 self.dbVerbindung.verwerfeAenderungen() 560 sys.exit()
561 562 563 # 564 # ------------------------------------------------------------------------------------ 565 # -- Infos zum Programm -------------------------------------------------- 566 # ------------------------------------------------------------------------------------ 567 #
568 - def __ereignisUeberWxvf__( self, ereignisDummy ):
569 """ 570 Methode die aufgerufen wird, um Informationen zum Programm auszugeben. 571 572 @param ereignisDummy: Es ist das C{wx - Ereignisobjekt} zur Ereignisbehandlung zu übergeben. Es wird jedoch nicht verwendet. 573 @type ereignisDummy: C{wx - Ereignisobjekt} 574 """ 575 576 # First we create and fill the info object 577 info = wx.AboutDialogInfo() 578 info.Name = u"wxvf" 579 info.Version = u"0.94" 580 info.Copyright = u"(C) 2010 Michael Bellair" 581 info.Description = wordwrap( 582 u"\'wxvf\' ist die Benutzeroberfläche zum Datenbankmodell 'Virtuelles Fahrzeug' ab Version 1.2. \nDas Datenbankmodell soll die Aspekte der Produktsicherheit abbilden, die Bestandteil des RAMS-Fachgebietes sind." 583 , 350 584 , wx.ClientDC(self) ) 585 info.WebSite = ("http://www.michaelbellair.de/vf/index.html", u"Die Homepage.") 586 info.Developers = [ u"Michael Bellair" ] 587 588 info.License = wordwrap(u"\'wxvf\' is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n\'wxvf\' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with \'wxvf\'. If not, see <http://www.gnu.org/licenses/>.", 500, wx.ClientDC(self)) 589 590 # Then we call wx.AboutBox giving it that info object 591 wx.AboutBox(info)
592