2013-11-02 18 views
1

我有一個簡單的程序,可以從用戶那裏獲取文本輸入,並將其顯示在儀器上(吉時利)。但是,該屬性似乎沒有改變。也就是說,當我運行Start方法時,即使在彈出窗口中更改了Display,輸出也是「Wowee」。我必須使它可編輯嗎?我不這麼認爲。我基本上是遵循Gael Varoquaux's介紹性狀。爲什麼屬性不會在用戶輸入的traitsui中更新

COntrolPanel.py:

from traits.api import * 
from traitsui.api import * 

import Keithley3706A_module 



class ControlPanel(HasTraits): 
    keithley2430settings = Instance(Keithley2430.Keithley2430Settings,()) 
    keithley3706Asettings = Instance(Keithley3706A_module.Keithley3706ASettings,()) 
    start = Button("Start Measurements") 
    clear_3706A_display = Button("Clear K3706A Display") 

    k3706A_settings = Keithley3706A_module.Keithley3706ASettings() 
    k3706A = Keithley3706A_module.Keithley3706A() 
    view = View(Item('start', show_label=False,style='custom'), 
     Item('clear_3706A_display', show_label=False,style='custom'), 
     Item('keithley2430settings',style='custom'), 
     Item('keithley3706Asettings',style='simple')) 


    def _start_fired(self): 
     print "hello %s" % self.k3706A_settings.display 
     self.k3706A.message(self.k3706A_settings.display) 

    def _clear_3706A_display_fired(self): 
     self.k3706A.clear() 

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

Keithley3706A.py:

from traits.api import * 
from traitsui.api import * 

import visa 
import time 

class Keithley3706ASettings(HasTraits): 
    display = String("Wowee") 

class Keithley3706A(HasTraits): 
    def __init__(self): 
     self.Keithley3706AUSB = visa.instrument("USB0::0x05E6::0x3706::04019447::INSTR") 

    def message(self,foo): 
     s="display.settext('%s')" % foo 
     self.Keithley3706AUSB.write("display.clear()") 
     self.Keithley3706AUSB.write(s) 

    def clear(self): 
     self.Keithley3706AUSB.write("display.clear()") 

回答

2

ControlPanel類,創建了兩個的Keithley3706ASettings,即keithley3706Asettingsk3706A_settings不同的實例。如果我刪除後者,並將k3706A_settings替換爲keithley3706Asettings,則可以使用。這裏是我的版本(與被去除的2430設備的引用,該k3706A特質聲明的Keithley3706AInstance,以及其他一些不相關的用戶界面的變化):

class ControlPanel(HasTraits): 

    keithley3706Asettings = Instance(Keithley3706A_module.Keithley3706ASettings,()) 

    k3706A = Instance(Keithley3706A_module.Keithley3706A,()) 

    start = Button("Start Measurements") 
    clear_3706A_display = Button("Clear K3706A Display") 

    view = View(UItem('start'), 
       UItem('clear_3706A_display'), 
       Item('keithley3706Asettings', style='simple')) 

    def _start_fired(self): 
     print "hello %s" % self.keithley3706Asettings.display 
     self.k3706A.message(self.keithley3706Asettings.display) 

    def _clear_3706A_display_fired(self): 
     self.k3706A.clear() 
+0

謝謝!那爲什麼它不工作?除了凌亂,不能有兩個實例嗎? 'k3706A = Instance(Keithley3706A_module.Keithley3706A,())'和'k3706A = Keithley3706A_module.Keithley3706A()'有什麼區別?我找不到「Instance()」的參考。 – DanG

+1

它沒有工作,因爲GUI正在更改一個實例,但'_start_fired'正在使用來自另一個實例的字符串,該字符串從未更改過。它沒有聲明'k3706A'是'Instance',我不記得是否有不使用'Instance'可能引起的特定問題,但是如果你打算使用Traits,你可能會你明確聲明的類型。下面的預定義特徵表中提到了「Instance」特徵類型:http://docs.enthought.com/traits/traits_user_manual/defining.html#predefined-traits –

+0

Aha!好的我知道了。感謝您的參考。應該更容易找到... – DanG

相關問題