Von einer Klasse auf eine andere zugreifen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
scrawl
User
Beiträge: 40
Registriert: Mittwoch 20. August 2008, 17:04
Kontaktdaten:

Von einer Klasse auf eine andere zugreifen

Beitragvon scrawl » Dienstag 9. September 2008, 16:21

Hi, da bin ich wieder, ich hoffe ihr könnt mir mal kurz helfen :P
Habe mich jetzt mal an einem größeren Programm versucht, scheitere aber jetzt daran, dass ich von der Menu-Klasse auf die Haupt-Klasse zugreifen möchte, was aber irgendwie nicht funktioniert.
Hier mal der Source:
main.py

Code: Alles auswählen

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk

import menu as menu

class SGMain:
   def __init__(self):
      window = gtk.Window(gtk.WINDOW_TOPLEVEL)
      window.set_title('ShopGen')
      window.maximize()
      window.set_border_width(5)
      
      content_box = gtk.VBox(False, 0)
      
      ObjSGMenu = menu.SGMenu()
      
      window.connect("delete_event", self.close_window)
      
      content_box.show()
      window.show()
      
   def close_window(self, widget, event, data=None):
      gtk.main_quit()
      return 0

def main():
   gtk.main()
   
if __name__ == '__main__':
   ObjSGApp = SGMain()
   main()

menu.py

Code: Alles auswählen

import gtk

class SGMenu:
   def __init__(self):
      file_menu = gtk.Menu()
      quit_item = gtk.MenuItem("Beenden")
      file_menu.append(quit_item)
      
      quit_item.connect("activate", self.menu_item_callback, "quit")
      
      quit_item.show()
      
      menu_bar = gtk.MenuBar()
      ObjSGApp.window.add(menu_bar)
      menu_bar.show()

      file_item = gtk.MenuItem("File")
      file_item.show()
      
      menu_bar = gtk.MenuBar()
      ObjSGApp.window.add(menu_bar)
      menu_bar.show()
      
      file_item.set_submenu(file_menu)
      menu_bar.append(file_item)
   def menu_item_callback(self, widget, data=None):
      if data == "quit":
         ObjSGApp.close_window(None, None, None)

Ich bekomm folgende Fehlermeldung:
Traceback (most recent call last):
File "main.py", line 33, in <module>
ObjSGApp = SGMain()
File "main.py", line 18, in __init__
ObjSGMenu = menu.SGMenu()
File "/home/scrawl/Dev/Shopgen 3.0/menu.py", line 14, in __init__
ObjSGApp.window.add(menu_bar)
NameError: global name 'ObjSGApp' is not defined
Mit "global ObjSGApp" hab ich es schon probiert, geht aber auch nicht :cry:
Freue mich auf Antworten

MfG
BlackJack

Beitragvon BlackJack » Dienstag 9. September 2008, 17:56

Es wäre nett, wenn Du Dich an den Styleguide halten könntest was Namen angeht. Insbesondere Namen, die mit Grossbuchstaben beginnen, sind in der Regel *Klassen* vorbehalten. Und der Namenspräfix `Obj` ist so überflüssig wie nur irgendwas weil in Python *alles* ein Objekt ist. Informationsgehalt des Präfix ist also 0.

Wenn Du in einem Exemplar von `SGMenu` auf das `SGMain`-Exemplar zugreifen willst, solltest Du es beim Erzeugen des `SGMenu`-Exemplars einfach als Argument mit geben und in der `SGMenu.__init__()` an das Exemplar binden.
scrawl
User
Beiträge: 40
Registriert: Mittwoch 20. August 2008, 17:04
Kontaktdaten:

Beitragvon scrawl » Dienstag 9. September 2008, 18:12

Danke, funktioniert :D
Habs jetzt so gelöst dass ich dem SGMenu das window als Argument mitliefere und er es dann wieder returnt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder