Начиная новый цикл событий для всплывающего окна chaco-traits из pyside?

Я пытаюсь сделать слайдер изображений с использованием chaco, который запускается из PySide. Я пытался использовать matplotlib, но ему не хватало скорости для обновления, поэтому я вместо этого пробовал chaco. Приведенный ниже сценарий начинается с инициализации диалогового окна Pyside, отсюда я пытаюсь открыть окно chaco / traits, которое используется для отображения различных представлений массивов с использованием ползунка для прокрутки массивов, как в фильме. Сценарий работает, но я получаю предупреждение:

QCoreApplication::exec: The event loop is already running 

Я думаю, что мне, вероятно, нужно запустить окно chaco, используя собственный поток или что-то еще, но я не уверен, как это сделать. Любая помощь будет принята с благодарностью, скрипт ниже:

import numpy as np
import sys
from PySide.QtCore import *
from PySide.QtGui import *

app = QApplication(sys.argv)

from traits.api import *
from traitsui.api import *
from enable.api import *
from enable.component_editor import *
from chaco.api import *
from chaco.tools.api import *
from chaco import *


class chacoWindow(HasTraits):
    #Chaco popup window with slider
    plot = Instance(HPlotContainer)
    #Slider max value is set using Frame
    Frame = Int
    high = 100

    traits_view = View(Group(
                    Item('plot', 
                             editor=ComponentEditor(), 
                             show_label=False),
                    Item( 'Frame', 
                             editor = RangeEditor( 
                             high_name   = 'high',
                             format      = '%d',
                             is_float    = False))),
                   width=1000, height=600, resizable=True, title="Track viewer")

    def __init__(self, dataDict, arg1):

        self.high = arg1 - 1
        self.dataDict = dataDict

        self.data1 = self.dataDict['Movie1']
        self.data2 = self.dataDict['Movie2']

        #Left plot
        self.plotdata1 = ArrayPlotData(image1 = self.data1['0'])
        plotLeft = Plot(self.plotdata1)
        plotLeft.img_plot("image1")               
        #Right plot  
        self.plotdata2 = ArrayPlotData(image2 = self.data2['0'])
        plotRight = Plot(self.plotdata2)
        plotRight.img_plot("image2")

        #Add some zoom/pan tools
        plotLeft.tools.append(PanTool(plotLeft))
        plotLeft.tools.append(BetterZoom(plotLeft, zoom_factor=0.8, zoom_to_mouse = True))
        plotLeft.tools.append(DragZoom(plotLeft, drag_button="right"))   
        plotRight.tools.append(PanTool(plotRight))
        plotRight.tools.append(BetterZoom(plotRight))
        plotRight.tools.append(DragZoom(plotRight, drag_button="right"))
        #Axes shared          
        plotLeft.range2d = plotRight.range2d
        container = HPlotContainer(plotLeft, plotRight)
        self.plot = container

    def _Frame_changed(self):
        #Change frame when slider changes
        self.plotdata1.set_data("image1", self.data1[str(self.Frame)])
        self.plotdata2.set_data("image2", self.data2[str(self.Frame)])


class Form(QDialog):
    #Basic form dialog using Pyside
    def __init__(self, dataDict, parent=None):
        super(Form, self).__init__(parent)
        self.dataDict = dataDict 
        self.totalFrames = len(dataDict['Movie1'])
        formatButton1 = QPushButton("Format 1")        
        buttonLayout = QHBoxLayout()
        buttonLayout.addStretch()
        buttonLayout.addWidget(formatButton1)
        #Add VBox space for extra widgets
        layout = QVBoxLayout()        
        layout.addLayout(buttonLayout)
        self.setLayout(layout)
        self.connect(formatButton1, SIGNAL("clicked()"), self.setChaco)                     
        self.setWindowTitle('Master form')

    def setChaco(self):
        #Create chaco window instance
        scatter = chacoWindow(dataDict, self.totalFrames)
        scatter.configure_traits(self) 


if __name__ == "__main__":       
    #make some demo data
    ar0 = np.zeros((25,25))
    ar0[10][10] = 1
    ar1 = np.zeros((25,25))
    ar1[12][12] = 1    
    #Dictionary of images
    dataDict = {'Movie1': {'0': ar0, '1':ar1, '2':ar0}, 
                'Movie2': {'0': ar1, '1':ar0, '2':ar1}}
    form = Form(dataDict)
    form.show()
    app.exec_()

1 ответ

Решение

Мне удалось найти решение. Изменение этой функции решает проблему:

def setChaco(self):
    #Create chaco window instance
    scatter = chacoWindow(dataDict, self.totalFrames)
    #Change this line: scatter.configure_traits(self)
    scatter.edit_traits() 

Похоже, что цикл обработки событий PySide обрабатывает все.

Другие вопросы по тегам