如何将函数处理程序从其他文件导入Python/GTK Builder程序?

0 投票
2 回答
1420 浏览
提问于 2025-04-16 04:43

我有一个Python脚本,它使用一个glade文件来定义用户界面,并且有很多重复的控件,每个控件用来调整某个活动对象的不同数值属性。因为这些控件很重复,我决定把所有的处理函数放在一个单独的文件里,这样可以让代码更整洁、更易读。以下是一些代码片段:

主文件:

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()

Handlers.py文件:

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()

当我运行这个程序时,用户界面正常显示,但当我移动滑块时,就出现了这个错误:

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

我对命名空间和作用域有一点了解,但我对Python和面向对象编程还是很菜,所以我不太清楚该怎么做。任何帮助都非常感谢。

2 个回答

0

缺少了 obj 这个参数或者名称。也许你需要导入一些东西并进行赋值,或者把它加到处理函数的参数里?那么 obj 到底应该是什么呢?

0

我觉得你在很多地方都忘记了 self 这个参数。

也就是说,把这个:

class Handlers:
    def adjustbottomBracketHeight(widget):
        obj.bottomBracketHeight = widget.get_value()

改成

class Handlers:
    def adjustbottomBracketHeight(obj, widget):
        obj.bottomBracketHeight = widget.get_value()

撰写回答