0

我正在使用 Enthought 的 Traits 在 python 中开发一个 GUI。我不断收到“RuntimeError:在 cmp 中超出最大递归深度”如果我翻转在 MainWindow 类中使用“Item”标签的顺序,则代码可以正常执行。我似乎找不到任何关于为什么会发生这种情况的文档。似乎与查科情节有关。下面是我的测试代码。

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 面板下方显示该图,以便用户可以看到他们正在收集的实时数据。

干杯,铲子

4

1 回答 1

2

您需要从您的_plot_default方法中删除以下行: self.plot = plot 要在特征中发生这种情况,您只需返回该绘图对象,并且对 self.plot 的分配将由 Traits 完成。发生递归错误是因为您尝试在plot尝试设置它的方法中访问对象的属性。

于 2014-03-05T21:09:19.973 回答