Wie Funktion Handler aus anderer Datei in einen Python / GTK Builder Programm importieren?
Frage
Ich habe ein Python-Skript, das eine Glade-Datei verwendet, um seine Benutzeroberfläche zu definieren, und hat eine Menge von sich wiederholenden Widgets, von denen jeder eine andere numerische Attribut eines bestimmten aktiven Objekt einzustellen. Da es sich wiederholt, entschied ich mich für die Verkapselung und Lesbarkeit alle Handler in einer separaten Datei zu definieren. Hier sind einige Code-Auszüge:
Die Hauptdatei:
import pygtk
pygtk.require('2.0')
import gtk, gobject, cairo, gtk.glade
from Handlers import Handlers
from FramesetParameters import FramesetParameters
from GeometricRules import GeometricRules
from BikeDrawing import BikeDrawing
p=FramesetParameters("fitting", "handling", "construction")
builder = gtk.Builder()
builder.add_from_file("FramesetDesignerUI.glade")
Handlers(p)
builder.connect_signals(Handlers.__dict__)
mainWindow = builder.get_object("mainWindow")
mainWindow.show_all()
gtk.main()
Die Handlers.py-Datei:
class Handlers:
def adjustbottomBracketHeight(widget):
obj.bottomBracketHeight = widget.get_value()
def adjustseatTubeAngle(widget):
obj.seatTubeAngle = widget.get_value()
def adjustseatTubeLength(widget):
obj.seatTubeLength = widget.get_value()
def adjusttopTubeLength(widget):
obj.topTubeLength = widget.get_value()
def adjustheadTubeAngle(widget):
obj.headTubeAngle = widget.get_value()
def adjustheadTubeTopHeight(widget):
obj.headTubeTopHeight = widget.get_value()
def adjustrearAxlePosition(widget):
obj.rearAxlePosition = widget.get_value()
def adjusttrail(widget):
obj.trail = widget.get_value()
def adjustseatTubeExtension(widget):
obj.seatTubeExtension = widget.get_value()
def adjustheadTubeUpperExtension(widget):
obj.headTubeUpperExtension = widget.get_value()
def adjustheadTubeLowerExtension(widget):
obj.headTubeLowerExtension = widget.get_value()
def adjustforkCrownBulk(widget):
obj.forkCrownBulk = widget.get_value()
Wenn ich das Programm ausführen, die GUI zeigt sich richtig, aber wenn ich einen Schieber bewegen bekomme ich diesen Fehler:
Traceback (most recent call last):
File "/home/helton/Dropbox/Profilez/00Computacional/00REFACTORY97/Handlers.py", line 6, in adjustseatTubeAngle
obj.seatTubeAngle = widget.get_value()
NameError: global name 'obj' is not defined
Ich weiß ein wenig über Namespaces und Umfang, aber ich bin sehr Noob auf Python und Object Orientieren im Allgemeinen, so dass ich weiß nicht, exactely was ich tun soll. Jede Hilfe wäre sehr geschätzt.
Lösung
Ich glaube, Sie das self
Argument vergessen haben alle über den Platz.
d. ändern diese:
class Handlers:
def adjustbottomBracketHeight(widget):
obj.bottomBracketHeight = widget.get_value()
class Handlers:
def adjustbottomBracketHeight(obj, widget):
obj.bottomBracketHeight = widget.get_value()
Andere Tipps
die obj
Argumente oder Namen fehlen. vielleicht müssen Sie etwas importieren und zuweisen, oder es für die Handler-Funktionen auf die Argumente hinzufügen? was genau ist die obj
denn sein?