2014-03-05 93 views
0

我正在使用Enthought的特性在python中開發GUI。我不斷收到一個「RuntimeError:在cmp中超出最大遞歸深度」如果我翻轉在我的MainWindow類中使用「Item」標籤的順序,代碼執行得很好。我似乎無法找到任何有關這種情況發生的文件。這似乎與查科情節有關。以下是我的測試代碼。Python特性GUI遞歸深度

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

+0

請提供堆棧跟蹤。如果堆棧軌跡長達數百行(遞歸錯誤常常是這種情況),請提供最後十行左右。 – Kevin

回答

2

您需要從_plot_default方法刪除以下行: self.plot = plot 對於這個在性狀發生,你只需要簡單地返回該劇情對象和self.plot意願分配由特質完成。發生遞歸錯誤是因爲您試圖訪問試圖設置它的方法內的對象的plot屬性。

+0

太棒了!這工作!謝謝! – user3385386