Python图形用户界面递归深度

Python图形用户界面递归深度,python,recursion,enthought,traits,chaco,Python,Recursion,Enthought,Traits,Chaco,我正在用python开发一个GUI,使用Enthound的特性。我不断得到一个“RuntimeError:maximum recursion depth Excelled in cmp”(运行时错误:cmp中超过了最大递归深度)如果我在我的MainWindow类中翻转“Item”标签的使用顺序,代码就会执行得很好。我似乎找不到任何关于为什么会发生这种情况的文档。这似乎与查科的阴谋有关。下面是我的测试代码 from chaco.api import ArrayPlotData, Plot from

我正在用python开发一个GUI,使用Enthound的特性。我不断得到一个“RuntimeError:maximum recursion depth Excelled in cmp”(运行时错误: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()
有人知道这段代码为什么会出现递归错误吗?我必须在我的用户输入面板下方显示绘图,以便用户可以看到他们正在收集的实时数据

干杯,
Shivels

您需要从
\u plot\u default
方法中删除以下行:

self.plot=绘图

为了在traits中实现这一点,您只需返回该plot对象,并通过traits完成对self.plot的赋值。发生递归错误是因为您试图访问试图设置它的方法中对象的
plot
属性

请提供堆栈跟踪。如果堆栈跟踪有数百行长(递归错误经常出现),请提供最后十行左右。