Глубина рекурсии графического интерфейса Python Traits

Я разрабатываю графический интерфейс в Python, используя черты Enthought. Я продолжаю получать "RuntimeError: максимальная глубина рекурсии превышена в cmp". Если я переверну порядок, в котором метки "Item" используются в моем классе MainWindow, код выполняется нормально. Я не могу найти какую-либо документацию о том, почему это произошло. Кажется, это как-то связано с сюжетом Чако. Ниже мой тестовый код.

from chaco.api import ArrayPlotData, Plot
from traits.api import HasTraits, Instance, String, Float, Enum, Button, Str
from traitsui.api import Handler, View, Item, Group, HSplit, NoButtons, VGroup, VGrid
from pyface.api import GUI
from threading import Thread
from time import sleep
from enthought.enable.component_editor import ComponentEditor
from scipy import rand, indices, exp, sqrt, sum
import numpy as np
from PIL import Image
import matplotlib.image as mpimg
from enthought.chaco.api import gray
from enthought.savage.traits.ui.svg_button import SVGButton


class User_Input_Panel(HasTraits):

    User = Str(name='User', label="User Name")
    Sample_Name = Str(name='Sample_Name',label="Sample Name")
    Path = Str(name='Path', label="Save Location", style = 'readonly')

    #I use this to create a folder icon on the button
    #~ Save_Folder_Button = SVGButton(label='Choose save Location', \
                            #~ filename=Folder-drag-accept.svg', \
                            #~ width=28, \
                            #~ height=28 \
                           #~ )



    #~ #Create the User Information panel
    User_Information_Panel = View(VGroup(
                                    VGrid(
                                          Item('User'), 
                                          Item('Sample_Name'), 
                                          Item('Path', width=.700, visible_when = 'Save_Visible == True'),                              
                                          #Item('Save_Folder_Button', show_label=False),
                                          ),
                                    show_border=True, label="User Information"
                                    ))

    def _Save_Folder_Button_fired(self, event):

        print("Pushed the Save Folder")
        #self.file, self.dir = wxOpenFile(multi=False)
        #fdir = GUI_tools.wxOpenFile()
        #fdir = GUI_tools.wxSavePath()


#I'm planning on setting up threading later
class MainWindowHandler(Handler):

    def close(self, info, is_OK):
        #~ if (info.object.user_input.acquisition_thread and \
            #~ info.object.user_input.acquisition_thread.isAlive()):
            #~ info.object.user_input.acquisition_thread.wants_abort = True
            #~ while info.object.user_input.acquisition_thread.isAlive():
                #~ sleep(0.1)
            #~ GUI.process_events()
        return True


class MainWindow(HasTraits):

    plot = Instance(Plot)
    plotdata = Instance(ArrayPlotData, ())
    user_input = Instance(User_Input_Panel, ())


    def _user_input_default(self):
        return User_Input_Panel(plotdata = self.plotdata)

    Save_Folder_Button = SVGButton(label='Choose save Location', \
                            filename='C:\Python27\Examples\Mill_GUI\Tescan_BatchScan\Folder-drag-accept.svg', \
                            width=28, \
                            height=28 \
                           )

    def _plot_default(self):
        self.plotdata = ArrayPlotData(imagedata=np.zeros((100,100)))
        plot = Plot(self.plotdata)
        plot.img_plot('imagedata')
        self.plot = plot
        return plot

    # If I flip the "Item('user_input'" with "Item('plot') the code will run...
    view = View(VGroup(Item('user_input', style = 'custom', show_label = False), 
                       Item('plot', editor = ComponentEditor(), dock = 'vertical'),
                       show_labels = False),
                       resizable = True, handler = MainWindowHandler(),
                       buttons = NoButtons)

if __name__ == '__main__':
    MainWindow().configure_traits()

Кто-нибудь знает, почему вы получите ошибки рекурсии с этим кодом? Я должен отобразить график под панелью user_input, чтобы пользователи могли видеть данные в реальном времени, которые они собирают.

Приветствия, Shivels

1 ответ

Решение

Вы должны удалить следующую строку из вашего _plot_default метод: self.plot = plot Для того, чтобы это произошло в чертах, вам просто нужно вернуть этот сюжетный объект, и присваивание self.plot будет выполняться чертами. Ошибка рекурсии происходит потому, что вы пытаетесь получить доступ к plot атрибут объекта внутри метода, который пытается его установить.

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