Seite 1 von 1

Eigener Namensraum

Verfasst: Montag 18. September 2006, 22:26
von JR
Hallo!

Habe eben viel zu Namensräumen gelesen, aber meine Frage blieb leider unbeantwortet :-(

Ich verwende wx.Python, und in diesem Zusammenhang möchte ich ein eigenes Modul schreiben, welches mir einfach viele Ids erstellt.

Beispiel:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# File: MyIds.pyw
import wx
MY_ID_1 = wx.NewId()
MY_ID_2 = wx.NewId()
MY_ID_3 = wx.NewId()
Nun soll dieses Modul einfach immer von meinen anderen Modulen importiert werden, um die Ids direkt über MY_ID_1 etc. zu haben.

Zweck:
Ich habe ein Modul, welches mir ein Menü generiert. Die Menüpunkte sollen für mich leicht erkennbare Ids erhalten, welche ich in einem anderen Modul (u.a. Ereignis "wx.EVT_MENU") auswerten möchte.

Ich hoffe, dass ist nachvollziehbar :-)

Viele Grüße
JR

Verfasst: Montag 18. September 2006, 23:52
von keppla
Ich hoffe, dass ist nachvollziehbar Smile
Ich befürchte, ganz sicher bin ich nicht.
Meinst du sowas?

Code: Alles auswählen

from jrsmodul import *
print MY_ID_1
wenn ja, was daran wurde in deiner Lektüre nicht beantwortet?
Eine simple Lösung dafür wäre nämlich eine Datei namens jrsmodul.py (im pythonpath) mit dem von dir geposteten codeinhalt.[/code]

Verfasst: Dienstag 19. September 2006, 00:03
von JR
Hey, der Tipp mit dem PYTHONPATH ist gut, danke!!

Verfasst: Dienstag 19. September 2006, 11:01
von CM
Hoi,

die Antwort ist zwar off-topic, aber irgendwie finde ich die Idee Code zu schreiben, um einen Haufen IDs zu generieren, etwas seltsam.

Shau mal hier, wie eine alternative Lösung aussehen kann: http://www.python-forum.de/topic-6891.html (Ich werde bald mal ein kleines Update dort reinpasten.) Ziel ist nicht etwa Eigenwerbung. Mich würde aber interessieren, weshalb die Idee einen Haufen IDs per Hand zu verwalten einfacher sein soll - lasse mich aber gerne eines Besseren belehren.

Gruß,
Christian

Verfasst: Dienstag 19. September 2006, 11:34
von keppla
Ich tippe mal darauf, dass das daran liegt, dass ich nicht genau weis, wofür genau diese IDs eingesetzt werden, aber den Gedanken, Konstanten irgendwie hübsch zu gruppieren, finde ich eigentlich recht ok.

statt

Code: Alles auswählen

PERMISSIONS_TEXT_MAY_UPDATE
finde ich

Code: Alles auswählen

import permissions.text
permissions.text.UPDATE
schon irgendwie hübscher. Aber vielleicht bin ich nur von Javas Typesafe Enums verdorben ;)

Verfasst: Dienstag 19. September 2006, 12:38
von CM
Zur Infor vorweg: IDs in wxPython sind eindeutige Integer (eigentlich longs), die dazu dienen können Widgets (oder auch Events) anzusprechen.

M. a. W. statt der Zahlen werden hier eine Menge von "Scheinkonstanten" gehandhabt. Widgets aber geben ihre IDs preis, wenn man sie höflich fragt. Also sehe ich nicht die Notwendigkeit beim Generieren der Menubar eine Liste von IDs explizit zuzuweisen und zu verwalten. (Ist für mich auch keine Frage des Namensraumes: Überall wo das Widget bekannt ist, kann man auch die ID erfragen.)

Gruß,
Christian

Verfasst: Mittwoch 20. September 2006, 17:28
von JR
Hallo CM!

Die Menüpunkte bzw. die MenuBar() mit den Menüs wird in einem Modul erstellt. Die zugewiesenen Ereignismethoden, welche von wx.EVT_MENU gerufen werden, gehören meiner Unterklasse des wx.MDIParentFrame in einem anderen Modul an. Um dort zu erkennen, welcher Menüpunkt (und zwar anhand des Menüpunktnamens) die Methode gerufen wird, benötige ich doch die Id. Es gibt zwar event.GetEventObject(), doch das gibt mir nur den Handle. Nun hat das Objekt wx.MenuItem() leider keinen Initialisierungsparameter name. Da mein Programm quasi i18n implementiert, sind die Menüpunkttexte wx.MenuItem.GetText() auch nicht hilfreich, da die Labels der Menüpunkte dynamisch sind (je nachdem, welche Sprache der Anwender gerade eingestellt hat).

Daher ist

Code: Alles auswählen

if event.GetEventObject().GetId() == MEINE_ID:
  bla bla
else:
  pass
hilfreich.

Grüße
JR

Verfasst: Donnerstag 21. September 2006, 14:18
von CM
Ah, Danke.

So ganz klar ist mir das immer noch nicht, aber vielleicht magst Du das mal als (vereinfachtes) Snippet (oder so) posten? Dafür klingt es allemal interessant genug.

Gruß,
Christian