2

わかりました、私は C、VisualBasic、および Fortran プログラマーです (はい、まだ存在しています)。Python 3.2 のパラダイム部分が欠けています。start_DAQ以下のコードで、関数がすべてのグローバルを認識しないのはなぜですか? do_DAQこの関数は、 、data_index、およびに対して独自のローカル変数を作成しているようですが、 ではありstart_timeませんstore_button。いくつかの同様の質問への回答を読みましたが、まだわかりません。グローバルステートメントを使用できると思いますが、それは悪い習慣だと言われました。

#-----------------------------------------------------------------------
#      define my globals
#-----------------------------------------------------------------------

#make an instance of my DAQ object and global start_time
myDaq = DAQ_object.DAQInput(1000,b"Dev2/ai0")
start_time = time.time()

#build data stuctures and initialize flags
time_data = numpy.zeros((10000,),dtype=numpy.float64)
volt_data = numpy.zeros((10000,),dtype=numpy.float64)
data_queue = queue.Queue()
data_index = 0
do_DAQ = False

#-----------------------------------------------------------------------
#      define the functions associated with the buttons
#-----------------------------------------------------------------------

def start_DAQ():
    do_DAQ = True
    data_index=0
    start_time = time.time()
    store_button.config(state = tk.DISABLED)

以下は、GUI を構築するためのコードです。

#make my root for TK
root = tk.Tk()

#make my widgets
fr = tk.Frame()
time_label = tk.Label(root, text="not started")
volt_label = tk.Label(root, text="{:0.4f} volts".format(0))
store_button = tk.Button(root, text="store Data", command=store_DAQ, state = tk.DISABLED)
start_button = tk.Button(root, text="start DAQ", command=start_DAQ)
stop_button = tk.Button(root, text="stop DAQ", command=stop_DAQ)
exit_button = tk.Button(root, text="Exit", command=exit_DAQ)
4

1 に答える 1

7

関数に次を追加します。

def start_DAQ():
    global do_DAQ 
    global data_index
    global start_time

    do_DAQ = True
    data_index=0
    start_time = time.time()
    store_button.config(state = tk.DISABLED)

Python は、書き込み時にローカル スコープに名前を隠す機能を実装しています。グローバル (モジュール スコープの変数) を読み込もうとすると、インタプリタはますます非ローカル スコープで変数名を探します。書き込もうとすると、新しい変数がローカル スコープで作成され、グローバルが非表示になります。
追加したステートメントは、書き込み時にグローバル スコープで名前を探すようにインタープリターに指示します。nonlocalモジュールスコープだけでなく、最も近いnolocalスコープの変数にインタープリターが書き込むステートメント(python 3.*では、2.7については不明)もあります。

于 2012-12-24T16:54:26.027 に答える