首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入代码时删除python基础对象

导入代码时删除python基础对象
EN

Stack Overflow用户
提问于 2011-09-02 08:58:34
回答 1查看 213关注 0票数 3

我有一个简单的程序,它创建一个QGraphicsScene / View,然后执行一个给定的文件(通过python的exec语句),并导出一些globals函数。

我的目标是只在新文件中定义场景代码,并且已经定义了一些帮助函数。

我的主程序中也有一个提供回调的线程,我想做一些关于回调的qgraphicsitems的事情。

这里的示例定义了链接到一个回调的不可见动画:

代码语言:javascript
复制
from PySide import QtGui

# definition of an animation of invisibility
class AnimInvisible:
    def __init__(self, item):
        self.item = item

    def on_callback(self, tag):
        self.item.setVisible(tag.getProperty() != 0)

# creation of a simple QGraphicsRectItem
mon_rect = QtGui.QGraphicsRectItem(400, 300, 100, 50)
mon_rect.setBrush(QtGui.QBrush(QtGui.QColor('red')))

# this will add the rect to the scene defined in the file
# where the exec statement is done (exported by exec)
addItem(mon_rect)


a = AnimInvisible(mon_rect)
# this connect the a.on_callback on some changes from a thread. (exported from exec)
addCallback(a.on_callback, 'system:cmdamg')

这个效果很好。但是现在,如果我将AnimInvisible的代码放在另一个模块(比如动画)中,我在上面的代码中替换为:

代码语言:javascript
复制
from animations import AnimInvisible

我收到一个错误,说内部C++对象(PySide.QtGui.QGraphicsRectItem)已经删除了。

我不明白这是一种很奇怪的行为。我也尝试使用PyQt而不是PySide,我得到了相同的行为(当AnimInvisible的代码在一个模块中时,对象被删除了,如果它在同一个文件中也没有问题)。

EN

回答 1

Stack Overflow用户

发布于 2011-09-08 09:02:38

多亏了你的评论,我发现了这个问题。

我在做这样的事情:

代码语言:javascript
复制
class Synoptique:
    def __init__(self, w, h):
        self.view = QGraphicsView()
        self.scene = SynopScene()
        # some initialization ...

def openSynop(buApp, fname, w, h):
    synop = Synoptique(w, h)
    var_export = {
        'addItem': synop.addItem,
        'addCallback': buApp.addCallback,
    }
    exec open(fname) in var_export
    synop.view.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)

    # buApp creation

    openSynop(buApp, 'synop.py', 800, 600)
    app.exec_()

但是,似乎失去了对synop对象(包含QGraphicsView和场景)的引用,因为它是openSynop函数中的一个局部变量。所以引用了QGraphicsView,场景,以及场景中丢失的对象。

处理这一问题的一种方法是在函数之外的主调用中声明synop实例,或者从函数中返回和保存synop引用。这解决了我的问题,例如:

代码语言:javascript
复制
def openSynop(buApp, fname, w, h):
    # same as before...

    return synop


if __name__ == '__main__':
    # same as before...

    s = openSynop(buApp, 'synop.py', 800, 600)
    app.exec_()

现在我明白了,我必须在QGraphicsView /场景上保留一个引用,以便以后操作场景中的QGraphicsItem .哇,这对我来说不是很明显,再次感谢!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7281243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档